打印无符号整数
输入一个无符号整数,按顺序打印每一位。
如输入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;
}