求字符串长度
分析题目:
字符字符串长度结束的表示是\0
因此我们只要判断指针是否指向\0即可
如果不是就加一 如果是结束循环
代码如下
int my_strlen(char* x) { int count = 0; while (*x !='\0') { count++; x++; } return count; } int main() { char arr[] = "abcdef"; int m=my_strlen(arr); printf("%d", m); return 0; }
这里对于新手来说有个需要注意点的点 就是传入的指针类型
因为数组是char类型的 所以传参的时候记得也要传入char类型的指针
不用临时变量 求字符串长度
题目分析
不用临时变量自然就想到递归的方法
如果是\0那么久返回一个0
如果不是\0就返回一个1+数组指向下一个数的递归
int my_strlen2(char* x) { if (*x !='\0') { return 1 + my_strlen(x + 1); } else { return 0; } } int main() { char arr[] = "abc123def"; int m=my_strlen2(arr); printf("%d", m); return 0; }
代码如上
易错点依然和上面一题一样
不过有一点值得注意的是 虽然my_strlen()中的x+1可以替换乘 ++x 但是博主却不建议这么做
因为如果这么做的话实际上x的值就改变了 指针指向的位置就改变了
虽然在这一题可能看上去没有什么问题 但是很有可能在以后遇到不可预料的错误
求5的阶乘(两种方式)
阶乘的方法
题目分析:
很简单
如果不是1 返回这个数本身和上一个数的阶乘
如果是1 返回1
代码如下
int my_fac(int x) { if (x>1) { return x * my_fac(x - 1); } else { return 1; } } int main() { int i = 5; int m = my_fac(i); printf("%d", m); return 0; }
不用阶乘
这样子更加简单了 前面的文章有过分析 一个for循环就能搞定
int main() { int n = 5; int i = 0; int fac = 1; for ( i = 1; i <= 5; i++) { fac *= i; } printf("%d", fac); return 0; }
代码如上
求斐波那契数
两种方法
使用阶乘:
题目分析:
当参数为1或者2的时候返回1
当参数为其他值的时候返回上一个数和上上的数字的和
参考代码如下
int fib(int x) { if (x>2) { return fib(x - 1) + fib(x - 2); } if (x<=2) { return 1; } } int main() { int b = fib(9); printf("%d", b); return 0; }
如果不使用递归的话 我们可以使用一种自下而上的思想来解决这道问题
我们可以设定三个参数 a b c
a就是往前数第二个fib数
b就是往前数第一个fib数
c就是当前是fib数
根据此思想指导我们可以有以下代码
int fib(int x) { if (x<=2) { return 1; } int a = 1; int b = 1; int c = 0; while (x>2) { c = a + b; a = b; b = c; x--; } return c; } int main() { int b = fib(2); printf("%d", b); return 0; }