> 文档中心 > C语言初阶必刷题-经典题精选

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;}