C 练习实例26
题目:利用递归方法求5!。
程序分析:递归公式:fn=fn_1*4!
下面请看笔者代码:
//题目:利用递归方法求5!。 // //程序分析:递归公式:fn = fn_1 * 4! #include <stdio.h> int fn(int n) { if (n == 1) return 1; else return n=n * fn(n - 1); } int main() { int n = 0; while (~scanf_s("%d", &n)) { printf("%d\n", fn(n)); } return 0; }
代码的运行结果为:
2.C 练习实例27
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
程序分析:无。
对于这等难度的练习题一开始没有思路,可以选择,由浅入深,一步步进行深入!从而破解该题!
因此对于该题,笔者首先想到的是:将5个字符,以相反顺序打印出来。然后在根据此问题来进行思考题目的代码
//题目;将5个字符,以相反顺序打印出来。 #include <stdio.h> #include <string.h> int main() { char ch[6] = "abcde"; int sz = strlen(ch); int left = 0; int right = sz - 1; while (left < right) { char tmp = ch[left]; ch[left] = ch[right]; ch[right] = tmp; left++; right--; } printf("%s\n", ch); return 0; }
上述代码,将5个字符,以相反顺序打印出来。所以,根据此代码,可以进行选择性的增添,从而达到目的!
笔者对于上述代码的更改就不做更多的讲述!
下面请看笔者的函数写法:参考代码为:
//利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 #include <stdio.h> void reverseSentence() { char c; c = getchar(); if (c != '\n') { reverseSentence(); putchar(c); } } int main() { printf("输入一个字符串: "); reverseSentence(); return 0; }
代码的运行结果为:
上述代码,用到了几个库函数,对于不知道用法的读者,可以在https://cplusplus.com 这个网站进行搜索!学习!
3.C 练习实例28
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。。
根据题意,这个题目,将会是函数的真正典范!!如果你能自主写出来该题目,那么你将能够成功出师!
#include <stdio.h> int reserve(int n) { if (n == 1) return 10; if (n > 1) return 2 + reserve(n - 1); } int main() { int n = 0; scanf_s("%d", &n); int ret = reserve(n); printf("%d\n",ret); }
这个代码,可以实现想求第几个人的年龄,就能求出来,简短许多!毕竟规律在哪儿放着来!!
代码的运行结果为:
4.C 练习实例29
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
对于该题目,可以选择创建数组来进行不多于五位数字的输入(不过该写法就得首先知道要输入的是几位数),也可以直接输入该数字来进行求!
1.直接输入该数字进行求:参考代码为:
//题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 #include <stdio.h> int 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 %ld\n", e, d, c, b, a); } else if (b != 0) { printf("为 4 位数,逆序为: %ld %ld %ld %ld\n", e, d, c, b); } else if (c != 0) { printf("为 3 位数,逆序为:%ld %ld %ld\n", e, d, c); } else if (d != 0) { printf("为 2 位数,逆序为: %ld %ld\n", e, d); } else if (e != 0) { printf("为 1 位数,逆序为:%ld\n", e); } }
上述代码显得臃肿,而且不是该函数的写法!不是很建议!!!
2.下面请看笔者对于函数的写法!!参考代码为:
#include<stdio.h> int the_mount_of_noumbles(int n) { int i = 0; while (n) { n /= 10; i++; } return i; } void print_noumbles(int n) { int i; while (n) { i = n % 10; n /= 10; printf("%d", i); } } int main() { int n; printf("输入一个数: "); scanf_s("%d", &n); printf("它是 %d 位数", the_mount_of_noumbles(n)); print_noumbles(n); return 0; }
上述代码,笔者定义了两个函数,分别实现:输入的数字有几位数,逆序打印该数字!!
代码的运行结果为:
3.假设知道输入的是几位数!请看参考代码!!
选择创建数组来进行不多于五位数字的输入(不过该写法就得首先知道要输入的是几位数)
#include <stdio.h> int main() { int arr[10] = { 0 }; int n = 0; scanf_s("%d", &n); //假设知道几位数 int i = 0; for (i = 0; i < n; i++) { scanf_s("%d", &arr[i]); } int left = 0; int right = n - 1; while (left < right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } for (i = 0; i < n; i++) { printf("%d", arr[i]); } return 0; }
代码的运行结果为:
5.C 练习实例30 - 回文数
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
程序分析:学会分解出每一位数。
参考代码为:
//题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。 // //程序分析:学会分解出每一位数。 #include <stdio.h> int main() { long ge, shi, qian, wan, x; printf("请输入 5 位数字:"); scanf_s("%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"); } }
代码的运行结果为:
对于函数的习题,本次就到此结束,有兴趣的读者,请看笔者之前的练习题!!