#include <stdbool.h>
// 返回:是完全平方数->true 否则->false
bool isSquare(int num) {
if(num<0) return false;
if (num==0 || num==1) return true;
long long root = (long long)sqrt(num);
return (root*root==num) || ((root+1)*(root+1)==num);
}
// 返回:三位数有两位数字相同->true 否则->false
bool isSame2(int num){
if(num<100 || num>=1000) return false;
int nums[3];
for(int i=0;i<3;++i){
nums[i]=num%10;
num/=10;
}
if(nums[0]!=nums[1]
&& nums[1]!=nums[2]
&& nums[2]!=nums[0]){
return false;
}
return true;
}
// 返回:[101,n]中有两位数字相同的完全平方数个数
int search(int n){
int cnt=0;
for(int i=101;i<=n;++i){
if(isSquare(i) && isSame2(i)){
++cnt;
}
}
return cnt;
}
// 递归:求阶乘
double fact(int n){
// 递归出口
if(n==0){
return 1.0;
}
// 递归体
return fact(n-1)*n;
}
// 返回:阶乘和
double factsum(int n){
// 返回值
double result=0.0;
// 求阶乘和
for(int i=1;i<=n;++i){
result+=fact(i);
}
// 返回
return result;
}
// 递归:指数函数
double calc_pow(double x, int n){
// 递归出口
if(n==1){
return x;
}
// 递归体
return calc_pow(x,n-1)*x;
}
// 返回:求简单交错幂级数的部分和
double fn(double x, int n){
if(n==1) return x;
return -pow(-1*x,n)+fn(x,n-1);
}
// 递归:计算Ackermenn函数
int Ack(int m,int n){
// 递归出口
if(m==0){
return n+1;
}
// 递归表达式
int result;
if(n==0 && m>0){
result=Ack(m-1,1);
}else{
result=Ack(m-1,Ack(m,n-1));
}
return result;
}
// 递归:求Fabonacci数列
int f(int n){
// 递归出口
if(n<=1){
return n;
}
// 递归体
return f(n-1)+f(n-2);
}
// 递归:十进制转换二进制
void dectobin(int n) {
// 递归出口
if(n<2){
printf("%d",n);
return;
}
// 递归表达式
dectobin(n/2);
printf("%d",n%2);
}
// 递归:输出整数
void printdigits(int n){
if(n<=9){
printf("%d\n",n);
return;
}
printdigits(n/10);
printf("%d\n",n%10);
return;
}
int insert(int a[ ], int value){
int i, pos;
// 检查value是否已存在
if (query(a, value) != -1) {
return -1;
}
// 找到插入位置
pos = 0;
while (pos < Count && a[pos] < value) {
pos++;
}
// 将pos及之后的元素后移
for (i = Count; i > pos; i--) {
a[i] = a[i-1];
}
// 插入新元素
a[pos] = value;
Count++;
return pos;
}
int del(int a[ ], int value){
int i, pos;
// 查找value的位置
pos = query(a, value);
if (pos == -1) {
return -1;
}
// 将pos之后的元素前移
for (i = pos; i < Count - 1; i++) {
a[i] = a[i+1];
}
Count--;
return pos;
}
int modify(int a[ ], int value1, int value2){
int pos1, pos2;
// 检查value1是否存在
pos1 = query(a, value1);
if (pos1 == -1) {
return -1;
}
// 检查value2是否已存在
if (query(a, value2) != -1) {
return -1;
}
// 删除value1
del(a, value1);
// 插入value2
insert(a, value2);
return 0;
}
int query(int a[ ], int value){
int left = 0, right = Count - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (a[mid] == value) {
return mid;
} else if (a[mid] < value) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
// 返回:最后一次找到的该字符在字符串中的位置(地址)
char *match(char *s, char ch){
char *last_pos = NULL;
int i = 0;
// 遍历字符串,找到最后一次出现的位置
while (s[i] != '\0') {
if (s[i] == ch) {
last_pos = &s[i];
}
i++;
}
return last_pos;
}
《《程序设计》函数题|031-040》有1条评论