打印无符号整数
输入一个无符号整数,按顺序打印每一位。
如输入1234输出1234
解题思路
假设输入的是1234这个数,可以通过%10得到4 可以通过/10%10得到3以此类推。
代码如下
#include<stdio.h> void Print(unsigned int n) { if (n>9) { Print(n / 10); } printf("%d", n % 10); } int main() { unsigned int num = 0; scanf("%d", &num); Print(num); return 0; }
运行结果
注意
红色的线是调用的过程,绿色的线是回调的过程。
函数计算字符的长度
不使用临时变量求字符串的长度和使用临时变量求字符串的长度
解题思路
字符串是以’\0’为结束的,所以我们只要判断是否是‘\0’。
代码如下
创建临时变量来求字符串长度
#include<stdio.h> int Strlen(char* p) { int count = 0; while (1) { if (*(p++) != '\0') { count++; } else { break; } } return count; } int main() { char* p = "abced"; int len = Strlen(p); printf("%d", len); return 0; }
不创建临时变量来求字符串长度
#include<stdio.h> int Strlen(char* p) { if (*p=='\0') { return 0; } else { return 1 + Strlen(p+1); } } int main() { char* p = "abced"; int len = Strlen(p); printf("%d", len); return 0; }
运行结果
注意
不要把传值调用和传址调用搞混淆了。
求n的阶乘
输入一个数,然后输出这个数的阶乘
解题思路
如果输入的数是5的话,那么它的阶乘就是54321
代码如下
使用递归的方式实现:
#include<stdio.h> int factorial(int n) { if (n<=1) { return 1; } else { return n * factorial(n - 1); } } int main() { int n = 0; scanf("%d", &n); //调用函数返回最终的结果 int ret=factorial(n); printf("%d",ret); return 0; }
使用循环的方式实现:
#include<stdio.h> int factorial(int n) { int i = 0; int sum = 1; for ( i = n; i >= 1; i--) { sum = sum * i; } return sum; } int main() { int n = 0; scanf("%d", &n); //调用函数返回最终的结果 int ret=factorial(n); printf("%d", ret); return 0; }
运行结果
使用递归的方式运行结果
使用循环的方式运行结果
计算斐波那契数
什么是斐波那契数
1 1 2 3 5 8 13 21 34 55…
就是前两项之和等于第三项
解题思路
代码如下
#include<stdio.h> int Fac(int n) { if (n<=2) { return 1; } else { return Fac(n - 1) + Fac(n - 2); } } int main() { int n = 0; scanf("%d", &n); int ret = Fac(n); printf("%d", ret); return 0; }
运行结果
递归实现n的k次方
编写一个函数实现n的k次方,使用递归实现。
代码如下
//递归实现n的k次方 #include<stdio.h> int Pow(int n, int k) { if (k==0) { return 1; } else { return n * Pow(n, k-1); } } int main() { int n = 0; int k = 0; scanf("%d %d", &n, &k); int ret = Pow(n, k); printf("%d", ret); return 0; }
运行结果