C语言初阶必刷题-经典题精选
文章目录
- 函数判断素数
- 函数判断闰年
- 打印一个数的每一位
- 求阶乘
-
-
- 非递归实现
- 递归实现
-
- strlen的模拟
-
-
- 非递归实现
- 递归实现
-
- 字符串逆序
-
-
- 非递归实现
- 递归实现
-
- 方法二
-
- 计算一个数的每位之和(递归实现)
- 递归实现n的k次方
- 递归和非递归分别实现求第n个斐波那契数
-
-
-
- 递归实现
- 非递归实现
-
-
函数判断素数
题目内容:
实现一个函数,判断一个数是不是素数。
利用上面实现的函数打印100到200之间的素数。
#include #include int is_prime(int x){int j = 2;for (j = 2;j < sqrt(x);j++){if (x % j ==0)return 0;}return 1;}int main(){int i = 0;for (i = 100;i <= 200;i++){if (is_prime(i))printf("%d ", i);}return 0;}
函数判断闰年
题目内容:
实现函数判断year是不是润年。
判断闰年:
第一种情况:能被4整除但不能被100整除的是闰年。
第二种情况:能够被400整除的是闰年。
这两种结合起来就能全面判断是不是闰年
#include int is_leap_year(int x){if ((x % 4 == 0 && x % 100 != 0) || (x % 400 == 0))return 1;return 0;}int main(){int year = 0;printf("请输入:");scanf("%d", &year);if (is_leap_year(year))printf("%d年是闰年", year);elseprintf("%d年不是闰年", year);return 0;}
打印一个数的每一位
递归方式实现打印一个整数的每一位
如:
输入1234
打印:1 2 3 4
#include void print(unsigned int x){if (x > 9){print(x / 10); }printf("%d ", x % 10);}int main(){unsigned int a = 0;scanf("%u", &a); print(a); //接收一个无符号整数,按照顺序打印它的每一位return 0;}
求阶乘
递归和非递归分别实现求n的阶乘(不考虑溢出的问题)
非递归实现
#include int ert(int x){int i = 0;int ret = 1;for (i = 1;i <= x;i++){ret *= i;}return ret;}int main(){int a = 0;scanf("%d", &a);printf("%d", ert(a));return 0;}
递归实现
#include int ert(x){if (x <= 1)return 1;elsereturn x * ert(x - 1);}int main(){int a = 0;scanf("%d", &a);printf("%d",ert(a));return 0;}
strlen的模拟
递归和非递归分别实现strlen
非递归实现
#include int my_strlen(char* str){int count = 0;while (*str != '\0'){count++;str++; //找下个字符}return count;}int main(){char arr[100];scanf("%s", &arr);int len = my_strlen(arr);printf("%d", len);}
递归实现
int my_strlen(char* str){if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;}int main(){char arr[100];scanf("%s", &arr);int len = my_strlen(arr);printf("%d", len);}
字符串逆序
编写一个函数 reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如:
char arr[] = “abcdef”;
逆序之后数组的内容变成:fedcba
非递归实现
#include int main(){char arr[] = "abcdefg"; //[a b c d e f g \0]int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz - 2; //int right=strlen(arr)while (left < right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}printf("%s\n", arr);return 0;}
递归实现
void reverse(char* str){char tmp = *str;int len = strlen(str);*str = *(str + len - 1);*(str + len - 1) = '\0';if(strlen(str+1)>=2) reverse(str + 1);*(str + len - 1) = tmp;}int main(){char arr[] = "abcdefg";reverse(arr);printf("%s\n",arr);return 0;}
方法二
void reverse(char arr[], int left, int right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;if (left < right)reverse(arr, left + 1, right - 1);}int main(){char arr[] = "abcdefg";int left = 0;int right = strlen(arr) - 1;reverse(arr,left,right);printf("%s\n",arr);return 0;}
计算一个数的每位之和(递归实现)
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
#include int DigitSum(unsigned int n){if (n > 9)return DigitSum(n / 10) + n % 10;elsereturn n;}int main(){unsigned int n = 0;scanf("%u", &n);int sum = DigitSum(n);printf("%d\n",sum);return 0;}
递归实现n的k次方
编写一个函数实现n的k次方,使用递归实现。
#include double Pow(int n, int k){if (k > 0)return n * Pow(n, k - 1);else if (k == 0)return 1;elsereturn 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;}
递归和非递归分别实现求第n个斐波那契数
例如:
输入:5 输出:5
输入:10, 输出:55
输入:2, 输出:1
递归实现
#include int Fun(int x){if (x <= 2)return 1;elsereturn Fun(x - 1) + Fun(x - 2);}int main(){int a = 0;scanf("%d", &a);int ret = Fun(a);printf("%d", ret);return 0;}
非递归实现
int Fib(int n){int a = 1;int b = 1;int c = 0;while (n >= 3){c = a + b;a = b;b = c;n--;}return c;}int main(){int n = 0;scanf("%d", &n);int ret = Fib(n);printf("%d", ret);return 0;}