ToB企服应用市场:ToB评测及商务社交产业平台

标题: C语言练习题 [打印本页]

作者: 石小疯    时间: 2025-2-12 12:53
标题: C语言练习题
1. 递归实现将字符串str中的元素逆序

  1. void ReverseStr2(char* str) {
  2.         char temp = *str;
  3.         int len = strlen(str);
  4.         *str = *(str + len - 1);
  5.         *(str + len - 1) = '\0';
  6.         if (strlen(str + 1) > 1) ReverseStr2(str + 1);
  7.         *(str + len - 1) = temp;
  8. }
复制代码
2. 对数组arr进行冒泡排序(升序)

  1. void BubbleSort(int arr[], int size)
  2. {
  3.         // 这里求sizeof(arr)是错误的,因为arr实际上是一个指针,其长度是固定的8个字节
  4.         // int size = sizeof(arr) / sizeof(arr[0]);
  5.         for (int i = 0; i < size - 1; i++) {
  6.                 int flag = 0;
  7.                 for (int j = size - 1; j > i; j--) {
  8.                         if (arr[j - 1] > arr[j]) {
  9.                                 swap_2(&arr[j - 1], &arr[j]);
  10.                                 flag = 1;
  11.                         }
  12.                 }
  13.                 if (!flag) return;
  14.         }
  15. }
复制代码
3. 对数组从下标low到下标hihg区间内的元素进行快速排序(升序)

  1. /// <summary>
  2. /// 对数组从下标low到下标hihg区间内的元素进行快速排序(升序)
  3. /// </summary>
  4. /// <param name="arr">整形数组</param>
  5. /// <param name="low">起始元素下标</param>
  6. /// <param name="high">终止元素下标</param>
  7. void QuickSort(int arr[], int low, int high) {
  8.         if (low < high) {
  9.                 int pivot_pos = Partition(arr, low, high);
  10.                 QuickSort(arr, low, pivot_pos - 1);
  11.                 QuickSort(arr, pivot_pos + 1, high);
  12.         }
  13. }
  14. int Partition(int arr[], int low, int high) {
  15.         int pivot = arr[low];
  16.         while (low < high) {
  17.                 while (low < high && arr[high] >= pivot) --high;
  18.                 arr[low] = arr[high];
  19.                 while (low < high && arr[low] <= pivot) ++low;
  20.                 arr[high] = arr[low];
  21.         }
  22.         arr[low] = pivot;
  23.         return low;
  24. }
复制代码
4. 在数组中使用二分查找(折半查找)目标关键字

  1. /// <summary>
  2. /// 二分查找
  3. /// </summary>
  4. /// <param name="a">数组名</param>
  5. /// <param name="size">数组长度</param>
  6. /// <param name="key">目标关键字</param>
  7. /// <returns>
  8. /// 查找成功返回目标关键字在数组中的下标
  9. /// 否则返回-1
  10. /// </returns>
  11. int BianrySearch(int a[], int size,int key) {
  12.         int low = 0;
  13.         int high = size;
  14.         int mid;
  15.         while (low <= high) {
  16.                 mid = (low + high) / 2;
  17.                 if (a[mid] == key) return mid;
  18.                 else if (a[mid] < key) low = mid + 1;
  19.                 else high = mid - 1;
  20.         }
  21.         return -1;
  22. }
复制代码
5. 求n的阶乘

  1. int factorial(int n) {
  2.         if (n == 1) return 1;
  3.         else return n * factorial(n - 1);
  4. }
复制代码
6. 判断year是否为闰年

  1. /// <summary>
  2. /// 判断year是否为闰年
  3. /// </summary>
  4. /// <param name="year">年份year</param>
  5. /// <returns>是闰年返回1, 否则返回0</returns>
  6. int isLeapYear(int year) {
  7.         // 闰年的判断规则:能被4整除且不能被100整除 或 能被400整除
  8.         if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) return 1;
  9.         else return 0;
  10. }
复制代码
7. 求两个数的最大公约数(暴力求解)

  1. int GetGCD(int a, int b) {
  2.         int min = a < b ? a : b;
  3.         int m = min;
  4.         while (1) {
  5.                 if (a % m == 0 && b % m == 0) break;
  6.                 m--;
  7.         }
  8.         return m;
  9. }
复制代码
8. 求两个数的最大公约数(辗转相除法)

  1. int GetGCD_2(int a, int b) {
  2.         int c;
  3.         c = a % b; // 不用管a,b谁大谁小,结果都是一样的
  4.         while (c > 0) {
  5.                 a = b;
  6.                 b = c;
  7.                 c = a % b;
  8.         }
  9.         return b;
  10. }
复制代码
9. 统计1~100的所有整数中,出现多少个数字9

  1. // 9 19 29 39 49 59 69 79 89 90 91 92 93 94 95 96 97 98 99
  2. int GetNum9(void) {
  3.         int count = 0;
  4.         for (int i = 1; i <= 100; i++) {
  5.                 int num = i;
  6.                 while (num > 0) {
  7.                         if (num % 10 == 9) {
  8.                                 count++;       
  9.                         }
  10.                         num /= 10;
  11.                 }
  12.         }
  13.         return count;
  14. }
复制代码
10. 计算1/1 + 1/2 + 1/3 + 1/4 + … + 1/100的和

  1. double fractionSum(void) {
  2.         double sum = 0.0;
  3.         for (int i = 1; i <= 100; i++) {
  4.                 sum += 1.0 / i;
  5.         }
  6.         return sum;
  7. }
复制代码
11. 打印99乘法表

  1. void print_multiplication_table(void) {
  2.         for (int i = 1; i <= 9; i++) {
  3.                 for (int j = 1; j <= i; j++) {
  4.                         printf("%2d ×%2d = %2d\t", i, j, i * j);
  5.                 }
  6.                 printf("\n");
  7.         }
  8. }
复制代码
12. 求一个数的每位之和(递归)

  1. /// <summary>
  2. /// 计算一个数的每位之和(递归)
  3. /// </summary>
  4. /// <param name="n">非负整数n</param>
  5. /// <returns>返回组成它的数字之后</returns>
  6. unsigned int DigitSum(unsigned int n) {
  7.         //unsigned int sum = n % 10;
  8.         //n /= 10;
  9.         //if (n > 0) return sum + DigitSum(n);
  10.         //return sum;
  11.         if (n > 9) return DigitSum(n / 10) + n % 10;
  12.         else return n;
  13. }
复制代码
13. 求一个整数n的k次方

  1. /// <summary>
  2. /// 求一个数的k次方
  3. /// </summary>
  4. /// <param name="n">整数n</param>
  5. /// <param name="k">次方数k</param>
  6. /// <returns>返回n^k</returns>
  7. double myPow(int n, int k) {
  8.         if (k > 0) {
  9.                 return n * myPow(n, k - 1);
  10.         }
  11.         else if (k == 0) return 1;
  12.         else return 1.0 / myPow(n, -k);
  13. }
复制代码
14. 将数组中的内容逆序排列

  1. void ReverseArr(int arr[], int size)
  2. {
  3.         for (int i = 0; i < size / 2; i++) {
  4.                 int temp = arr[i];
  5.                 arr[i] = arr[size - 1 - i];
  6.                 arr[size - 1 - i] = temp;
  7.         }
  8. }
复制代码
15. 计算数组的标准差(整数部份)

  1. /// <summary>
  2. /// 计算数组的标准差
  3. /// </summary>
  4. /// <param name="arr">数组名</param>
  5. /// <param name="n">数组长度</param>
  6. /// <returns>正确长度返回标准差,错误长度返回-1</returns>
  7. int calculate_variance(int arr[], int n) {
  8.         if (n < 2) {
  9.                 printf("数组长度至少是2\a\n");
  10.                 return -1;
  11.         }
  12.         int i;
  13.         int sum = 0;                        // 总和
  14.         double mean = 0.0;                // 均值
  15.         double variance = 0.0;        // 方差
  16.         // 求和
  17.         for (i = 0; i < n; i++) {
  18.                 sum += arr[i];
  19.         }
  20.         // 求均值
  21.         mean = 1.0 * sum / n;
  22.         // 求方差
  23.         for (i = 0; i < n; i++) {
  24.                 variance += pow(arr[i] - mean, 2);        // math.h
  25.         }
  26.         variance /= n;
  27.         return (int)sqrt(variance);                // 返回标准差的整数部份
  28. }
复制代码
16. 判断一个数是否为素数

  1. /// <summary>
  2. /// 判断一个数是否为素数
  3. /// </summary>
  4. /// <param name="a">正整数a</param>
  5. /// <returns>是素数返回1,否则返回0</returns>
  6. int isPrime(int a){
  7.         // 素数的判定规则:对数a,把n除以从2到sqrt(a)之间的每一个数,只要有一个余数为0,就不是素数
  8.         if (a <= 1) return 0;
  9.         for (int i = 2; i * i <= a; i++) {
  10.                 if (a % i == 0) return 0;
  11.         }
  12.         return 1;
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4