- 一、递归求和
- 二、逆序递归
- 三、猜年龄
- 四、逆序
- 五、回文数
- 六、查询日期
- 七、删除指定字母
- 八、判断质数
- 九、函数调用
- 十、字符反转
题目描述
利用递归方法求5!。
题目分析
递归公式:fn=fn_1*4!
代码
#includeint main() { int i; int fact(int); for(i=0;i<6;i++){ printf("%d!=%dn",i,fact(i)); } } int fact(int j) { int sum; if(j==0){ sum=1; } else { sum=j*fact(j-1); } return sum; }
效果
题目描述
逆序递归
题目分析
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
源码
#includeint main() { int i=5; void palin(int n); printf("请输入5个字符40:40"); palin(i); printf("n"); } void palin(n) int n; { char next; if(n<=1) { next=getchar(); printf("相反顺序输出结果40:40"); putchar(next); } else { next=getchar(); palin(n-1); putchar(next); } }
效果
题目描述
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,
他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。请问第五个人多大?
题目分析
利用递归的方法,递归分为回推和递推两个阶段。 要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推
源码
#includeint age(n) int n; { int c; if(n==1) c=10; else c=age(n-1)+2; return(c); } int main() { printf("%dn",age(5)); }
效果
题目描述
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
题目分析
学会分解出每一位数
源码
#includeint main( ) { long a,b,c,d,e,x; printf("请输入 5 位数字:"); scanf("%ld",&x); a=x/10000; b=x%10000/1000; c=x%1000/100; d=x%100/10; e=x%10; if (a!=0){ printf("为 5 位数,逆序为: %ld %ld %ld %ld %ldn",e,d,c,b,a); } else if(b!=0) { printf("为 4 位数,逆序为: %ld %ld %ld %ldn",e,d,c,b); } else if(c!=0) { printf("为 3 位数,逆序为:%ld %ld %ldn",e,d,c); } else if(d!=0) { printf("为 2 位数,逆序为: %ld %ldn",e,d); } else if(e!=0) { printf("为 1 位数,逆序为:%ldn",e); } }
效果
题目描述
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
题目分析
学会分析每一位数。
源码
#includeint main( ) { long ge,shi,qian,wan,x; printf("请输入 5 位数字:"); scanf("%ld",&x); wan=x/10000; qian=x%10000/1000; shi=x%100/10; ge=x%10; if (ge==wan&&shi==qian) { printf("这是回文数n"); } else { printf("这不是回文数n"); } }
效果
六、查询日期题目描述
请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
题目分析
用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
源码
#includeint main() { char i,j; printf("请输入第一个字母:n"); scanf("%c",&i); getchar();//scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符 switch(i) { case 'm': printf("mondayn"); break; case 'w': printf("wednesdayn"); break; case 'f': printf("fridayn"); break; case 't': printf("请输入下一个字母n"); scanf("%c",&j); if (j=='u') {printf("tuesdayn");break;} if (j=='h') {printf("thursdayn");break;} case 's': printf("请输入下一个字母n"); scanf("%c",&j); if (j=='a') {printf("saturdayn");break;} if (j=='u') {printf("sundayn"); break;} default : printf("errorn"); break; } return 0; }
效果
题目描述
删除一个字符串中的指定字母,如:字符串 “aca”,删除其中的 a 字母。
题目分析
循环遍历,对照删除。
源码
#include#include #include // 删除字符串中指定字母函数 char* deleteCharacters(char * str, char * charSet) { int hash [256]; if(NULL == charSet) return str; for(int i = 0; i < 256; i++) hash[i] = 0; for(int i = 0; i < strlen(charSet); i++) hash[charSet[i]] = 1; int currentIndex = 0; for(int i = 0; i < strlen(str); i++) { if(!hash[str[i]]) str[currentIndex++] = str[i]; } str[currentIndex] = ' '; return str; } int main() { char s[2] = "a"; // 要删除的字母 char s2[5] = "aca"; // 目标字符串 printf("%sn", deleteCharacters(s2, s)); return 0; }
效果
题目描述
判断一个数字是否为质数。
题目分析
质数(prime number)又称素数,有无限个。 一个大于1的自然数,除了1和它本身外,不能被其他自然数整除
源码
#include#include #define MAX 1000 int prime[MAX]; int isPrimeNaive(int n) { if(n <= 1) return 0; for(int i = 2; i < n; i++) if(n % i == 0) return 0; return 1; } int isPrime(int n) { if(n<= 1) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; int limit = (int)sqrt((double)n); for(int i = 3; i <= limit; i=i+2) { if(n % i == 0) return 0; } return 1; } void sieve() { prime[0] = 0; prime[1] = 0; for(int i = 2; i < MAX; i++) prime[i] = 1; int limit = (int)sqrt((double)MAX); for(int i = 2; i <= limit; i++) { if(prime[i]) for(int j = i*i; j <= MAX; j+=i) prime[j] = 0; } } int isPrimeSieve(int n) { if(prime[n]) return 1; else return 0; } int main() { sieve(); printf("N=%d %dn", 1, isPrime(1)); printf("N=%d %dn", 2, isPrime(2)); printf("N=%d %dn", 3, isPrime(3)); printf("N=%d %dn", 4, isPrime(4)); printf("N=%d %dn", 7, isPrime(7)); printf("N=%d %dn", 9, isPrime(9)); printf("N=%d %dn", 13, isPrime(13)); printf("N=%d %dn", 17, isPrime(17)); printf("N=%d %dn", 100, isPrime(100)); printf("N=%d %dn", 23, isPrime(23)); printf("N=%d %dn", 1, isPrime(1)); return 0; }
效果
题目描述
练习函数调用。
题目分析
练习函数调用。
源码
#includevoid hello_world(void) { printf("Hello, world!n"); } void three_hellos(void) { int counter; for (counter = 1; counter <= 3; counter++) hello_world(); } int main(void) { three_hellos(); }
效果
题目描述
字符串反转,如将字符串 “www.abcd.com” 反转为 “moc.dcba.www”。
题目分析
无
源码
#includevoid reverse(char* s) { // 获取字符串长度 int len = 0; char* p = s; while (*p != 0) { len++; p++; } // 交换 ... int i = 0; char c; while (i <= len / 2 - 1) { c = *(s + i); *(s + i) = *(s + len - 1 - i); *(s + len - 1 - i) = c; i++; } } int main() { char s[] = "www.abcd.com"; printf("'%s' =>n", s); reverse(s); // 反转字符串 printf("'%s'n", s); return 0; }
效果



