一个整形值(无符号),按照顺序打印它的每一位6
输入:1234 输出 1 2 3 4
void print(unsigned int n)
{
if (n > 9)
{
print(n / 10);
}
printf("%d ", n % 10);
}
int main()
{
unsigned int num = 0;
scanf("%u", &num);//1234
print(num);//printf函数可以打印参数部分数字的每一位
return 0;
}
图解:
计算一个数的每位之和
int DigitSum(int n)
{
if (n > 9)
{
return DigitSum(n / 10) + n % 10;
}
else
{
return n;
}
}
int main()
{
int num = 1729;
int sum = DigitSum(num);
printf("%d\n", sum);
return 0;
}
打印字符的长度
- 函数方法
int my_strlen(char *str)
{
int count = 0;
while (*str != 0)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = { "bit" };
printf("%d\n", my_strlen(arr));
return 0;
}
- 递归方法
int my_strlen(char *str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int main()
{
char arr[] = "bit";
printf("%d\n", my_strlen(arr));
return 0;
}
图解
求阶乘
- 函数方法
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);
// int i,ret=1;
// for (i = 1; i <= n; i++)
// {
// i = i*ret;
// }
// printf("%d", i);
//}
- 递归方法
int fac(int n)
{
if (n <2)
return 1;
else
return n * fac(n-1);
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = fac(n);
printf("%d", ret);
}
图解
编写一个函数实现n的k次方
- 考虑n>0和n<0的情况
double Pow(int n, int k)
{
if (k == 0)
return 1.0;
else if (k > 0)
return n * Pow(n, k - 1);
else
return 1.0 / (Pow(n, -k));
}
int main()
{
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
double ret = Pow(n, k);
printf("%lf\n", ret);
return 0;
}
字符串逆序
写法1:
//void reverse_string(char* str)
//{
// int left = 0;
// int right = strlen(str) - 1;
//
// while (left < right)
// {
// char tmp = *(str + left);
// *(str + left) = *(str+right);
// *(str+right) = tmp;
// left++;
// right--;
// }
//}
void reverse_string(char* str)
{
int len = strlen(str);
if (strlen(str + 1) >= 2)//中间元素交换
{
char tmp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0'; //先把要放a的位置先放\0,然后让中间的元素先交换完,最后再把a交换放上去
reverse_string(str + 1);
*(str + len - 1) = tmp;
}
}
#include<stdio.h>
int main()
{
char arr[] = "abcdef";
reverse_string(arr);//数组名arr是数组arr首元素的地址
printf("%s\n", arr);
return 0;
}
写法2:
char *reverse(char *str)
{
int len = strlen(str);
if (len > 1)
{
char temp = str[0];
str[0] = str[len - 1];
str[len - 1] = '\0'; // 最后一个字符在下次递归时不再处理
reverse(str + 1); // 中间元素的处理
str[len - 1] = temp;
}
return str;
}
int main()
{
char str[100];
gets(str);
reverse(str);
puts(str);
return 0;
}
效率低的斐波那契数
- 递归不合适,递归太慢,且递归太深程序会崩溃出现栈溢出
//int fib(int n)
//{
// if (n <= 2)
// return 1;
// else
// return fib(n - 1) + fib(n - 2);
//}
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);
// int ret = fib(n);
// printf("%d\n", ret);
// return 0;
//}
斐波那契改进(递归不合适,但必须要递归,因为下面会导致栈溢出)
int fib(int n)
{
int a = 1; //(效率高,但是整形有限,可能数字过大会出错)
int b = 1;
int c = 0;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf_s("%d", &n);
int ret = fib(n);
printf("%d\n", ret);
return 0;
}
`