经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
关于C语言一维数组算法问题详解
来源:jb51  时间:2021/11/16 15:13:40  对本文有异议

问题1:将数组中的数逆序存放

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放, 再按顺序输出数组中的元素。

算法描述:1.向数组a中输入元素;

2.定义一个新数组new,将数组a中的元素倒序存放;

3.将数组b正序输出,注意结尾无空格的格式问题。

代码实现 : 

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n;
  5. scanf("%d",&n);
  6. int i,arr[n];
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr[i]);
  10. }
  11. int new[n],j; //定义一个数组new用来存入数组a的逆顺序
  12. for(int j = 0;j < n;j++)
  13. {
  14. new[j] = arr[n-1-i]; //倒序存入
  15. }
  16. for(int k = 0;k < n - 1;k++) //数组中最后一个元素不一起输入,保持结尾无空格
  17. {
  18. printf("%d ",new[k]);
  19. }
  20. printf("%d",new[n-1]); //输出最后一个元素
  21. return 0;
  22. }

运行结果:


问题2:求数组中最大值及其下标

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。 输入格式: 输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

算法描述:1.向数组中存放元素;

2.把数组中第一个元素先定义一个变量保存住;

3.遍历数组,如果比保存第一个元素的变量大,那就赋值给那个变量,直到变量值变为最大;

4.定义一个变量用来记录最大值的下标。

代码实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n;
  5. scanf("%d",&n);
  6. int arr[n],i;
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr[i]);
  10. }
  11. int max = arr[0]; //定义一个变量保存数组第一个元素
  12. for(int j = 1;j < n;j++)
  13. {
  14. if(max < arr[j]) //如果小于就一直给m,直到找到最大值停
  15. {
  16. max = arr[j];
  17. }
  18. }
  19. for(int num = 0;num < n;num++) //记录最大值下标操作
  20. {
  21. if(arr[num] == max)
  22. {
  23. printf("最大值为:%d\n其下标为:%d",max,num);
  24. break;
  25. }
  26. }
  27. return 0;
  28. }

运行结果:

问题3:找出不是两个数组的共有元素

本题要求给定两个整型数组,本题要求找出不是两者共有的元素。

算法描述:1.分别定义两数组并输入值;

2.用数组a中元素对比数组b中元素,非共有值放入c中(此处可以用一个 标志变量flag,标志 是否有共有值);

3.用数组b中元素对比数组a中元素,重复“2”操作;

4.最后先输出数组c中第一个元素,然后判断元素是否与之前录入元素

重复。

5.最后打印出来数组c中的元素,也就是非共有值,此处注意格式问题。

代码实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n;
  5. scanf("%d",&n);
  6. int arr1[n],i; //定义第一个数组
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr1[i]);
  10. }
  11. int m;
  12. scanf("%d",&m);
  13. int arr2[m],j; //定义第二个数组
  14. for(j = 0;j < m;j++)
  15. {
  16. scanf("%d",&arr2[j]);
  17. }
  18. int k,rem[20] = {}; //数组rem是用来记录非公有值的
  19. for(i = 0;i < n;i++)
  20. {
  21. int flag = 0; //定义标志变量用来标志是否有非共有值
  22. for(j = 0;j < m;j++)
  23. {
  24. if(arr1[i] == arr2[j]) //用数组1中元素对比数组2中元素,非共有值放入数组rem中
  25. {
  26. flag = 1;
  27. }
  28. }
  29. if(flag == 0)
  30. {
  31. rem[k] = arr1[i];
  32. k++;
  33. }
  34. }
  35. for(i = 0;i < m;i++) //用数组2中元素对比数组1中元素,非共有值放入数组rem中
  36. {
  37. int flag = 0;
  38. for(j = 0;j < n;j++)
  39. {
  40. if(arr2[i] == arr1[j])
  41. {
  42. flag = 1;
  43. }
  44. }
  45. if(flag == 0)
  46. {
  47. rem[k] = arr2[i];
  48. k++;
  49. }
  50. }
  51. printf("非共有元素:%d",rem[0]); //输出rem中第一个元素
  52. for(i = 1;i < k;i++)
  53. {
  54. for(j = 0;j < i;j++)
  55. {
  56. if(rem[i] == rem[j])
  57. {
  58. break;
  59. }
  60. }
  61. if(j >= i)
  62. {
  63. printf(" %d",rem[i]); //因为提前输出第一个元素,所以后面要打一个空格再打元素,
  64. //结尾无空格的格式问题
  65. }
  66. }
  67. return 0;
  68. }

运行结果:

问题4:找出出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式: 输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的

算法描述:1.定义两个数组,一个用来存放元素,另一个用来当计数器,此数组注意需 要初始化;

2.在这个数组中找到重复的,然后把计数器数组赋值+1;

3.一直遍历找到重复最多的,找到后把计数器数组元素赋值给变量max(也 就是出现次 数),计数器数组下标就是出现次数最多数的下标。

代码实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,arr[1000],cnt[1000] = {0}; //cnt为计数器数组,需要初始化
  5. int i,j,k,max = 0;
  6. scanf("%d",&n);
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr[i]);
  10. }
  11. for(i = 0;i < n;i++)
  12. {
  13. for(j = 0;j < n;j++)
  14. {
  15. if(arr[i] == arr[j]) //找到一样的
  16. {
  17. cnt[i] = cnt[i] + 1; //cnt[i]++
  18. }
  19. }
  20. }
  21. for(i = 0;i < n;i++)
  22. {
  23. if(max < cnt[i]) //一直遍历直到找重复最多的
  24. {
  25. max = cnt[i]; //找到后赋值给max
  26. k = i; //i就是重复最多的数的下标
  27. }
  28. }
  29. printf("出现次数最多的数字为:%d\n其出现次数为:%d",arr[k],max);
  30. return 0;
  31. }

运行结果:

问题5:数组中插入数字并排序

本题要求给出n个元素的数组,从小到大排列,再输入一个num,插入到数组中, 使得新数组依旧是从小到大的顺序(用一个数组完成)。

算法描述:1.定义一个数组并存放元素,单独记录好倒数第二个元素;

2.输入要插入的数字,注意可以考虑特殊情况,如果插入的数大于原本倒数 第二个数,就可以 直接插入赋值为最后一个元素;

3.再来考虑一般情况,遍历数组,如果原本的数大于要插入的数,先保存住 原来的数字,然 后把插入的数放入到原来的数的位置;

4.插入之后,原本的数就到了后一位,需要把后一位的位置保存住,把原本 的数放到后一 位,再把位置赋上原本数的值;

5.最后遍历输出数组元素 。

代码实现 :

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,i,j;
  5. scanf("%d",&n);
  6. int arr[n],t1,t2,num,end;
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr[i]);
  10. }
  11. scanf("%d",&num); //输入要插入的数字
  12. end = arr[n-1]; //保存倒数第二个元素
  13. if(num > end) //考虑特殊情况,如果插入的数大于倒数第二个
  14. {
  15. arr[n] = num; //直接插入赋值
  16. }
  17. else
  18. {
  19. for(i = 0;i < n;i++)
  20. {
  21. if(arr[i] > num) //如果原本的数大于插入的数
  22. {
  23. t1 = arr[i]; //先保存原来的数
  24. arr[i] = num; //把插入的数放到原来数的位置
  25. for(j = i + 1;j <= n;j++) //处理原来的数
  26. {
  27. t2 = arr[j]; //原来的数到了后一位保存住
  28. arr[j] = t1; //把原来的数赋值给现在要存的这个位置上
  29. t1 = t2;
  30. }
  31. break;
  32. }
  33. }
  34. }
  35. for(i = 0;i <= n;i++) //注意这里i<=n,因为多插入了一个数字
  36. {
  37. printf("%d ",arr[i]);
  38. }
  39. return 0;
  40. }

运行结果:

 

问题6:数组循环右移问题

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯*AN−1)变换为(ANMAN−1A0A1⋯ANM−1)(最后M个数循环移至最前面的M*个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格

输入样例:

6 2 1 2 3 4 5 6

结尾无空行

输出样例:

5 6 1 2 3 4

结尾无空行

算法描述:1.定义数组并存入元素,输入要移动的值;

2.注意先处理一下移动的值,让他和数组中元素的总个数取个余;

3.优先考虑特殊情况:如果移动的值为0,那直接打印;

4.移动k个,先把最后k个值放到前面,做特殊处理,方便剩余的元素打印;

5.然后再注意格式问题,打印出除最后一个以外的数字+空格,最后在打印 最后一个数。

代码实现:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int n,move;
  5. scanf("%d %d",&n,&move);
  6. int arr[n],i;
  7. for(i = 0;i < n;i++)
  8. {
  9. scanf("%d",&arr[i]);
  10. }
  11. move %= n; //取余算出到底移动多少,进行简化
  12. if(move == 0) //特殊情况特殊处理
  13. {
  14. for(i = 0;i < n - 1;i++)
  15. {
  16. printf("%d",arr[i]); //注意格式问题
  17. }
  18. printf("%d",arr[n-1]);
  19. return 0;
  20. }
  21. for(i = n - move;i < n;i++) //移动move,把最后move个数放前面
  22. {
  23. printf("%d ",arr[i]);
  24. }
  25. for(i = 0;i < n - move - 1;i++) //把剩下除了最后一个数,打印出来
  26. {
  27. printf("%d ",arr[i]);
  28. }
  29. printf("%d",arr[n-1-move]); //最后一个没空格
  30. return 0;
  31. }

运行结果:

总结

到此这篇关于关于C语言一维数组算法问题的文章就介绍到这了,更多相关C语言一维数组算法内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号