当前位置:   article > 正文

练习C简单的代码_c语言代码训练

c语言代码训练

1.判断一个数是否为奇数

2.输出1-100之间的奇数

3.计算n的阶乘

4.计算1!+2!+3!...+10!

5.在一个有序数组中查找具体的某个数字n  

6.编写代码,演示多个字符从两端移动,向中间汇聚

7.获得月份天数

8.统计输入的10个数,正数、负数、零的个数

9.调整奇数偶数顺序

10.strlen实现

11有序序列判断

12最高分和最低分之差

13X形图案

14箭形图案

15字符串左旋

16空心正方形图案

17有序序列插入一个数

18交换两个变量(不创建临时变量)

19统计二进制中1的个数

.1.1

a.首先第一步什么是奇数:奇数就是不能够被2整除的数;

b.我们需要输入一个数然后判断;

c.用if语句判断,如果输入的为奇数输出是奇数,否则不是奇数

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int num = 0;
  5. printf("请输入数字: ");
  6. scanf("%d", &num);
  7. if (num % 2 == 1)
  8. printf("这个数是奇数\n");
  9. else
  10. printf("这个数不是奇数\n");
  11. return 0;
  12. }

 .2.1

a.首先我们需要100个数字。这里可以通过循环实现,for循环是最简单的方式。

b.循环出现的数字我们需要判断这个数是否为奇数。在fou循环嵌套if语句,如果这个数是奇数就输出,否则不输出。在基础上我们可以同循环计算奇数的个数。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int count = 0;
  6. for (i = 1; i <= 100; i++)
  7. {
  8. if (i % 2 == 1)
  9. {
  10. printf("%-2d ",i);打印每次找到的奇数
  11. count++;//计算奇数的个数
  12. }
  13. }
  14. printf("\n1-100之间一共有:%d个奇数\n",count);
  15. return 0;
  16. }

.3.1 

a,首先需要输入一个数字计算阶乘

b,阶乘n!=n*(n-1)*(n-2)...*2*1。在循环里计算n的阶乘

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. int i = 0;
  6. int sum = 1;
  7. scanf("%d",&n);
  8. for (i = 1; i <= n; i++)
  9. {
  10. sum = sum * i;
  11. }
  12. printf("%d!=%d",n,sum);
  13. return 0;
  14. }

 .4.1

a,首先产生1-10个数字,循环实现。

b,在循环中实现阶乘,并且将所有的阶乘相加起来。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int j = 0;
  6. int n = 0;
  7. scanf("%d",&n);
  8. int sum = 0;
  9. for (i = 1; i <= n; i++)
  10. {
  11. int k = 1;//将这个变量放在这里是为了每次数字进来重置k
  12. for (j = 1; j <= i; j++)//计算一个数的阶乘
  13. {
  14. k*= j;
  15. }
  16. sum = sum + k;//将阶乘相加起来
  17. }
  18. printf("%d \n",sum);
  19. return 0;
  20. }

 .5.1

在一个有序数组中查找某个数字,如果用传统的方法需要查找很多次。如果用二分查找法就会节省很多时间。例如,在1-100之间猜一个数字,我们会从中间隔分,然后判断数字是猜大了还是猜小了。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf("请输入想要找到的数的下标:");
  5. int arr[10] = {1,2,3,4,5,6,7,8,9,10};
  6. int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的长度
  7. int left = 0;//最左边的下标
  8. int right = sz - 1;//最右边的下标。找出左右下标是为了计算中间值的下标
  9. int n = 0;
  10. scanf("%d",&n);
  11. while (right >= left)
  12. {
  13. int mid = (left + right) / 2;//下标的中间值
  14. if (arr[mid] < n)
  15. {
  16. left = mid+1;
  17. }
  18. else if (arr[mid] > n)
  19. {
  20. right = mid - 1;
  21. }
  22. else
  23. {
  24. printf("找到了,下标是:%d\n",mid);
  25. break;
  26. }
  27. }
  28. if (right < left)
  29. {
  30. printf("找不到\n");
  31. }
  32. return 0;
  33. }

 .6.1

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <windows.h>
  4. int main()
  5. {
  6. char arr1[] = "welcome to bit!!!";
  7. char arr2[] = "#################";
  8. int right = strlen(arr1)-1;//计算字符的长度
  9. int left = 0;
  10. while (left <= right)
  11. {
  12. arr2[right] = arr1[right];//将arr1的内容从右边给arr2
  13. arr2[left] = arr1[left];//将arr1的内容从左边给arr2
  14. printf("%s\n",arr2);
  15. Sleep(1000);//间隔时间
  16. left++;
  17. right--;
  18. }
  19. return 0;
  20. }

.7.1

多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。

针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

解题思路:

a,首先输入两个数字,需要多组输入,用while循环实现

b,年份就是考虑平年和闰年,平年二月份28天,闰年二月份29天。1,3,5,7,10,12都是31天,其他都是30天。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. //多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
  5. //针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
  6. int year = 0;
  7. int month = 0;
  8. int i = 0;
  9. int arr[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//将月份存到数组里面
  10. while (scanf("%d %d",&year,&month) != EOF)
  11. {
  12. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
  13. {
  14. printf("%d\n", arr[month-1]);//闰年29
  15. }
  16. else
  17. {
  18. if (month == 2)
  19. {
  20. printf("%d\n",arr[month-1]-1);//平年28天,数组下标2的-1就是28
  21. }
  22. else
  23. {
  24. printf("%d\n", arr[month-1]);
  25. }
  26. }
  27. }
  28. return 0;
  29. }

 .8.1

  1. #include <stdio.h>
  2. #define A 10
  3. int main()
  4. {
  5. //1.编程,统计在所输入的10个实数中有多少个正数、多少个负数、多少分零。
  6. int arr[A];
  7. int j = 0, k = 0, m = 0;
  8. for (int i = 0;i < A;i++)
  9. {
  10. scanf("%d", &arr[i]);
  11. if (arr[i] > 0)
  12. j++;
  13. else if (arr[i] < 0)
  14. k++;
  15. else
  16. m++;
  17. }
  18. printf("正数=%d\n负数=%d\n零=%d\n", j, k, m);
  19. return 0;
  20. }

.9.1调整奇数偶数顺序

要求:

输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分。

解题思路:

通过第一个下标,和最后一个坐标来进行实现。如果坐标是偶数,就与最右边的奇数进行交换,通过while循环来分别查找偶数,奇数。通过if语句进行交换。条件都是left<right

  1. #include <stdio.h>
  2. //输入一个整数数组,实现一个函数,
  3. //来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
  4. //所有偶数位于数组的后半部分。
  5. void move_odd_even(int* arr, int len)
  6. {
  7. int left = 0;
  8. int right = len - 1;
  9. int tmp = 0;
  10. while (left < right)
  11. {
  12. while ((left < right)&& (arr[left] % 2 == 1))//找到左边的奇数
  13. {
  14. left++;
  15. }
  16. while ((left < right) && (arr[right] % 2 == 0))//找到右边的偶数
  17. {
  18. right--;
  19. }
  20. if (left<right)//交换奇偶数
  21. {
  22. tmp = arr[left];
  23. arr[left] = arr[right];
  24. arr[right] = tmp;
  25. }
  26. }
  27. for (int i = 0; i < len; i++)
  28. {
  29. printf("%d ", arr[i]);
  30. }
  31. }
  32. int main()
  33. {
  34. int arr[] = { 1,2,3,4,5,6,7,2,9,0 };
  35. int len = sizeof(arr) / sizeof(arr[0]);
  36. move_odd_even(arr,len);
  37. return 0;
  38. }

 .10.1  strlen实现

要求:

模拟实现库函数strlen

  1. void my_strlen(char* arr)
  2. {
  3. int count = 0;
  4. char* p = arr;
  5. while (*p != '\0')
  6. {
  7. count++;
  8. p++;
  9. }
  10. printf("%d\n",count);
  11. }
  12. int main()
  13. {
  14. char arr[] = "my love!";
  15. my_strlen(arr);
  16. return 0;
  17. }

.11.1有序序列判断

要求:

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。

数据范围: 3 \le n \le 50 \3≤n≤50  序列中的值都满足 1 \le val \le 100 \1≤val≤100 

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. scanf("%d", &n);
  6. int j = 0;
  7. int i = 0;
  8. int arr[100] = { 0 };
  9. int flag = 0;
  10. for (int i = 0; i < n; i++)
  11. {
  12. scanf("%d", &arr[i]);
  13. }
  14. for (i = n - 1, j = 0; i > 0; i--, j++)
  15. {
  16. if ((arr[i] >= arr[i - 1]) || (arr[j] >= arr[j + 1]))//从升序和降序考虑
  17. {
  18. flag = 1;
  19. }
  20. else
  21. {
  22. flag = 0;
  23. break;
  24. }
  25. }
  26. if (flag)
  27. printf("sorted\n");
  28. else
  29. printf("unsorted\n");
  30. return 0;
  31. }

.12.1最高分和最低分之差

要求:

描述

输入n个成绩,换行输出n个成绩中最高分数和最低分数的差。

输入描述:

两行,第一行为n,表示n个成绩,不会大于10000。

第二行为n个成绩(整数表示,范围0~100),以空格隔开。

输出描述:

一行,输出n个成绩中最高分数和最低分数的差。

方法一:

  1. #include <stdio.h>
  2. void dif_arr(int* arr,int n)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < n - 1; i++)//进行冒泡排序,以降序的方法
  7. {
  8. for (j = 0; j < n - 1 - i; j++)
  9. {
  10. if (arr[j] < arr[j + 1])
  11. {
  12. int tmp = arr[j];
  13. arr[j] = arr[j + 1];
  14. arr[j + 1] = tmp;
  15. }
  16. }
  17. }
  18. printf("%d\n",arr[0]-arr[n-1]);
  19. }
  20. int main()
  21. {
  22. int n = 0;
  23. int arr[100] = { 0 };
  24. int i = 0;
  25. scanf("%d",&n);
  26. for (i = 0; i < n; i++)
  27. {
  28. scanf("%d",&arr[i]);
  29. }
  30. dif_arr(arr,n);
  31. return 0;
  32. }

方法二:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. int max = 0;
  6. int min = 100;
  7. scanf("%d", &n);
  8. int i = 0;
  9. int tmp = 0;//存放内次读取的成绩
  10. for(i=0; i<n; i++)
  11. {
  12. scanf("%d", &tmp);
  13. if(tmp > max)
  14. max = tmp;
  15. if(tmp < min)
  16. min = tmp;
  17. }
  18. printf("%d\n", max-min);
  19. return 0;
  20. }

.13.1有序序列合并

要求:

数据范围: 1 \le n, m \le 1000 \1≤n,m≤1000  , 序列中的值满足 0 \le val \le 30000 \0≤val≤30000 

输入描述:

输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

  1. #include <stdio.h>
  2. void again_arr(int* arr, int k)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < k - 1; i++)//冒泡排序
  7. {
  8. for (j = 0; j < k - i - 1; j++)
  9. {
  10. if (arr[j] >arr[j + 1])
  11. {
  12. int tmp = arr[j];
  13. arr[j] = arr[j + 1];
  14. arr[j + 1] = tmp;
  15. }
  16. }
  17. }
  18. for (i = 0; i < k; i++)
  19. {
  20. printf("%d ", arr[i]);
  21. }
  22. }
  23. int main()
  24. {
  25. int m = 0;
  26. int n = 0;
  27. int arr[2000] = { 0 };
  28. int i = 0;
  29. int j = 0;
  30. scanf("%d%d",&m,&n);
  31. for (i = 0; i < m; i++)
  32. {
  33. scanf("%d",&arr[i]);
  34. }
  35. for (i = m; i < m+n; i++)
  36. {
  37. scanf("%d", &arr[i]);
  38. }
  39. int k = m + n;
  40. again_arr(arr, k);
  41. return 0;
  42. }

 .13.1X形图案

要求:

输入描述:

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

输出描述:

针对每行输入,输出用“*”组成的X形图案。

解题思路:

把这个图案看成一个数组,然后把有‘*’的坐标写出来,会发现两个规律,当i=j,i+j=n-1,就会出现*

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. int i = 0;
  6. int j = 0;
  7. while(scanf("%d",&n)!=EOF)
  8. {
  9. for (i = 0; i < n; i++)
  10. {
  11. for (j = 0; j < n; j++)
  12. {
  13. if (i == j)
  14. {
  15. printf("*");
  16. }
  17. else if((i+j)==n-1)
  18. {
  19. printf("*");
  20. }
  21. else
  22. {
  23. printf(" ");
  24. }
  25. }
  26. printf("\n");
  27. }
  28. }
  29. return 0;
  30. }

.14.1箭形图案 

要求:

输入描述:

本题多组输入,每行一个整数(2~20)。

输出描述:

针对每行输入,输出用“*”组成的箭形。

示例1

输入:

2
输出:

    *
  **
***
  **
    *

示例2

输入:

3
输出:
      *
    **
  ***
****
  ***
    **
      *

解题思路:

分为两个部分解析,上部分和下部分,然后找规律。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. int i = 0;
  6. int j = 0;
  7. while (scanf("%d", &n) != EOF)
  8. {
  9. //打印上部分
  10. for (i = 0; i <= n; i++)
  11. {
  12. for (j = 0; j < 2 * n - (i * 2); j++)
  13. {
  14. printf(" ");
  15. }
  16. for (j = 0; j < i + 1; j++)
  17. {
  18. printf("*");
  19. }
  20. printf("\n");
  21. }
  22. //打印下部分
  23. for (i = 0; i < n; i++)
  24. {
  25. for (j = 0; j < (2 + i * 2); j++)
  26. {
  27. printf(" ");
  28. }
  29. for (j = 0; j < n - i;j++)
  30. {
  31. printf("*");
  32. }
  33. printf("\n");
  34. }
  35. }
  36. return 0;
  37. }

.15.1字符串左旋

要求:

实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

解题思路:

假如左旋3个字符,将第三个之后的字符都向前移动,需要两个循环体,控制每次移动的个数。

  1. #include <stdio.h>
  2. #include <string.h>
  3. void reverse_left(char* arr, int n)
  4. {
  5. int len = strlen(arr);
  6. int i = 0;
  7. for (i = 0; i < n; i++)
  8. {
  9. int b = arr[0];
  10. int j = 0;
  11. for (j = 0; j < len - 1; j++)
  12. {
  13. arr[j] = arr[j + 1];
  14. }
  15. arr[len - 1] = b;
  16. }
  17. printf("%s\n", arr);
  18. }
  19. int main()
  20. {
  21. int n = 0;
  22. scanf("%d",&n);
  23. char arr[] = "ABCDEF";
  24. reverse_left( arr, n);
  25. return 0;
  26. }

 .16.1空心正方形图案

要求:

输入描述:

多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。

输出描述:

针对每行输入,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。

解题思路:

通过找规律

方法一:通过数组,先打印外面的*, 再来一个小的打印空格

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int j = 0;
  6. int n = 0;
  7. int arr[100][100] = { 0 };
  8. while (scanf("%d", &n) != EOF)
  9. {
  10. for (i = 0; i < n; i++)
  11. {
  12. for (j = 0; j < n; j++)
  13. {
  14. arr[i][j] = '*';
  15. }
  16. }
  17. for (i = 1; i < n - 1; i++)
  18. {
  19. for (j = 1; j < n - 1; j++)
  20. {
  21. arr[i][j] = ' ';
  22. }
  23. }
  24. for (i = 0; i < n; i++)
  25. {
  26. for (j = 0; j < n; j++)
  27. {
  28. printf("%c ", arr[i][j]);
  29. }
  30. printf("\n");
  31. }
  32. }
  33. return 0;
  34. }

方法二:通过找到有*的规律打印

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. while (scanf("%d", &n) != EOF)
  6. {
  7. for (int i = 0; i < n; i++)
  8. {
  9. for (int j = 0; j < n; j++)
  10. {
  11. if (i == 0 || i == (n - 1) || j == 0 || j == (n - 1))
  12. printf("* ");
  13. else
  14. printf(" ");
  15. }
  16. printf("\n");
  17. }
  18. }
  19. return 0;
  20. }

.17.1有序序列插入一个数

要求:

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个升序排列的整数,输入用空格分隔的N个整数。

第三行输入想要进行插入的一个整数。

输出描述

输出为一行,N+1个有序排列的整数。

方法一:通过冒泡排序

  1. #include <stdio.h>
  2. void add_num(int* arr, int n, int m)
  3. {
  4. arr[n] = m;
  5. int i = 0;
  6. int j = 0;
  7. for (i = 0; i <= n-1; i++)
  8. {
  9. for (j = 0; j <= n - i - 1; j++)
  10. {
  11. if (arr[j] > arr[j + 1])
  12. {
  13. int tmp = arr[j];
  14. arr[j] = arr[j + 1];
  15. arr[j + 1] = tmp;
  16. }
  17. }
  18. }
  19. for (i = 0; i <= n; i++)
  20. {
  21. printf("%d ",arr[i]);
  22. }
  23. }
  24. int main()
  25. {
  26. int n = 0;
  27. int arr[50] = { 0 };
  28. int i = 0;
  29. scanf("%d",&n);
  30. for (i = 0; i < n; i++)
  31. {
  32. scanf("%d",&arr[i]);
  33. }
  34. int m = 0;
  35. scanf("%d",&m);
  36. add_num(arr, n, m);
  37. return 0;
  38. }

方法二:将这个插入的数,与数组进行对比

  1. 作者:牛客108287542
  2. 链接:https://www.nowcoder.com/discuss/389135905569734656
  3. 来源:牛客网
  4. #include <stdio.h>
  5. int main()
  6. {
  7. int arr[20] = { 0 };
  8. int n = 0;
  9. int i = 0;
  10. int tmp = 0;
  11. scanf("%d", &n);
  12. for (int i = 0; i < n; i++)
  13. {
  14. scanf("%d", &arr[i]);
  15. }
  16. int m = 0;
  17. scanf("%d", &m);
  18. for (i = n-1; i >=0; i--)
  19. {
  20. if (m < arr[i])
  21. {
  22. arr[i + 1] = arr[i];
  23. arr[i] = m;
  24. //arr[i] = arr[i + 1];
  25. }
  26. else
  27. break;
  28. }
  29. arr[i + 1] = m;
  30. for (int i = 0;i <= n;i++)
  31. {
  32. printf("%d ", arr[i]);
  33. }
  34. }

.18.1交换两个变量(不创建临时变量)

a^a=0;  a^0=a  a^a^b=b  a^b^a=b

自己可以动手实验一下

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 3;
  5. int b = 5;
  6. printf("交换前:a=%d,b=%d\n",a,b);
  7. a = a ^ b;
  8. b = a ^ b;
  9. a = a ^ b;
  10. printf("交换后:a=%d,b=%d\n", a, b);
  11. return 0;
  12. }

 .19.1统计二进制中1的个数

要求:

写一个函数返回参数二进制中 1 的个数。

比如: 15    0000 1111    4 个 1

方法一:(移位与1进行相与)

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 0;
  5. scanf("%d",&a);
  6. int i = 0;
  7. int count = 0;
  8. for (i = 0; i < 32; i++)
  9. {
  10. if (((a >>i ) &1 ) == 1)
  11. {
  12. count++;
  13. }
  14. }
  15. printf("%d\n",count);
  16. return 0;
  17. }

 方法二:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. unsigned int n = 0;
  5. scanf("%d",&n);
  6. int count = 0;
  7. while (n)
  8. {
  9. if (n % 2 == 1)
  10. count++;
  11. n /= 2;
  12. }
  13. printf("%d\n",count);
  14. return 0;
  15. }

 方法三:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n = 0;
  5. scanf("%d",&n);
  6. int count = 0;
  7. while (n)
  8. {
  9. n = n & (n - 1);
  10. count++;
  11. }
  12. printf("%d\n", count);
  13. return 0;
  14. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码优化者/article/detail/62905
推荐阅读
相关标签
  

闽ICP备14008679号