C语⾔程序设计第五版谭浩强课后答案第六章习题答案1. ⽤筛选法求100之内的素数
解析:这题的关键是要知道什么是筛选法, 。
1int main()
2{
3 int i = 0, j = 0;
4 int arr[100];
5 //录⼊数字
6 for (i = 0; i < 100; i++)
7 {
8  arr[i] = i + 1;
9 }
10 //1不是素数,直接写0,或者在上⼀步就把0写进去。
11 arr[0] = 0;
12 //这⼀步是实现筛选法
13 //筛选法实际上就是⽤后⾯的数字整除当前数字
14 //如果后⾯的数字能够整除当前值,则将其排除
15 //按照这样的步骤以次继续,直⾄到达范围边缘
16 for (i = 0; i < 100; i++)
17 {
18  for (j = i + 1; j < 100; j++)
19  {
20  //这个if要注意,在第⼀轮筛选的时候已经把很多数字写0
21  if (arr[j] != 0 && arr[i] != 0)
22  {
23    //如果后⾯的数字可以整除当前值
24    //说明后⾯的数字肯定不是素数
25    //我这⾥说的整除和取模是⼀样的,都是余数为0
26    if (arr[j] % arr[i] == 0)
27    {
28    arr[j] = 0;
29    }
30  }
31  }
32 }
33 //打印筛选后的数字
34 for (i = 0; i < 100; i++)
35 {
36
37  if (arr[i] != 0)
38  {
39  printf("%d ", arr[i]);
40  }
41 }
42 return 0;
43}
运⾏结果:
2. ⽤选择法对10个整数排序
解析:问题来了啥是选择法呢? 。
简单来说就是把最⼩值或者最⼤值标记出来,当⽐较结束后把标记值和⾸位(或者末位)做交换,通过多轮⽐较,排出想要的顺序。
1//打印
2void print(int* arr,int sz)
3{
4 for (int i = 0; i <= sz; i++)
5 {
6  printf("%d ", arr[i]);
7 }
8 printf("\n");
9
10}
11
12int main()
13{
14 int i, j, pos;
15 int arr[] = { 2,8,3,9,5,7,1,4,0,6 };
c语言数组最大值最小值
16 int sz = sizeof(arr) / sizeof(arr[0])-1;
17 print(&arr,sz);//这是⾃定义的打印函数,不是printf
18 for (i = 0; i <= sz; i++)
19 {
20  pos = 0;//将标记置于第⼀位
21  for (j = 1; j <= sz-i; j++)//⽐较位从第⼆位开始,sz-i是为了让范围缩⼩
22  {
23  if (arr[j] > arr[pos])
24  {
25    pos = j;//如果⽐较值⽐标记值⼤,便将⽐较值坐标赋值给标记坐标
26  }
27  }
28  if (pos != sz-i)//⽐较完成后判断标记坐标是不是在边界
29  {
30  int temp = arr[pos];
31  arr[pos] = arr[sz-i];
32  arr[sz-i] = temp;
33  }
34 }
35 print(&arr, sizeof(arr) / sizeof(arr[0]) - 1);//sz已经被改变了,要重新计算
36 return 0;
37}
既然可以把最⼤值筛选出来,就可以把最⼩值筛选出来,如果两个⼀起进⾏效率会⼤很多。
3. 求⼀个3 X 3的整形矩阵对⾓线元素之和
解析:创建矩阵和创建数组是⼀样的,像这⼀题要创建3x3的整形矩阵,可以这样操作int arr[3][3];先⾏后列很简单。
3 int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
4 int i, j;
5 int right_sum = 0, left_sum = 0;
6
7 for (i = 0; i <= 2; i++)
8 {
9  for (j = 0; j <= 2; j++)
10  {
11  if (i == j)
12  {
13    left_sum += arr[i][j];
14  }
15  if (i == 2 - j)
16  {
17    right_sum += arr[i][j];
18  }
19  }
20 }
21  printf("左对⾓线的数值为%d\n", left_sum);
22  printf("右对⾓线的数值为%d\n", right_sum);
23 return 0;
24}
运⾏结果:
4. 有⼀个已经排好序的数组,要求输⼊⼀个数后,按原来顺序的规律将它插⼊数组中
解析:这个题⽬有⼀种简单⼜粗暴的办法:把插⼊的数字放在数组末端,然后再做⼀次排序。
但是我觉得这个⽅法不好,我们应该换⼀个思路:⾸先我们将插⼊的数字和数组相⽐较,如果插⼊的数字⽐原来数组的数字⼩,就把数组数字的⾓标给定位下来,并把原来数组数字向后挪⼀位。
3 int i, j;
4 int arr[10] = {1,2,3,4,5,6,7,8,9};
5 int input = 0;
6 int end = 8;//数组最后⼀位数字的⾓标就是8
7 printf("请输⼊要插⼊的数据:>");
8 scanf("%d", &input);
9 printf("当前排列情况:>");
10 for (i = 0; i < 9; i++)
11 {
12  printf("%d ", arr[i]);
13 }
14 printf("\n");
15 //如果插⼊的数字⽐原来数组的数字⼩
16 //就把数组数字的⾓标给定位下来,并把原来数组数字向后挪⼀位。
17 while (end >= 0 && input < arr[end])
18 {
19  arr[end + 1] = arr[end];
20  end--;
21 }
22 arr[end + 1] = input;
23 printf("插⼊排列情况:>");
24 for (i = 0; i < 10; i++)
25 {
26  printf("%d ", arr[i]);
27 }
28 printf("\n ");
29 return 0;
30}
运⾏结果:
5. 将⼀个数组中的值按逆序重新存放。例如:原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。解析:这⼀题较上⼀题就简单多了,可以⽤简单的⽅法也可以⽤复杂的⽅法。
复杂的⽅法就是重新排序,⼗种排序⽅法你随便选择;
简单的⽅法就是数值交换:数组左右交换,当左坐标⼤于等于右坐标时停⽌;
3 //vs⽤的时C99标准,数组的定义必须为常量
4 //如果⽤⽀持C11标准的编译器,这⾥可以⽤变量定义,实现灵活定义数组
5 int arr[] = { 8,6,5,4,1 };
6 //这个sz随意,可以⾃⼰写数值,不⼀定要计算
7 int sz = sizeof(arr) / sizeof(arr[0]);
8 int left = 0, right = sz - 1;
9 //打印
10 printf("初始序列:>");
11 for (int i = 0; i < sz ; i++)
12 {
13  printf("%d ",arr[i]);
14 }
15 printf("\n");
16 //重新排序
17 //数组左右交换,当左坐标⼤于等于右坐标时停⽌
18 while (left < right)
19 {
20  int temp = arr[left];
21  arr[left] = arr[right];
22  arr[right] = temp;
23  left++;
24  right--;
25 }
26 //打印
27 printf("重排序列:>");
28 for (int i = 0; i < sz; i++)
29 {
30  printf("%d ", arr[i]);
31 }
32 printf("\n");
33 return 0;
34}
运⾏结果:
6. 输出以下的杨辉三⾓(要求输出10⾏)
1  1
2  1  1
3  1  2  1
4  1  3  3  1
5  1  4
6  4  1
6  1  5  10  10  5  1
7……
解析:这题的关键在于知道什么是杨辉三⾓,杨辉三⾓的规律是什么。不知道还不点 ?解杨辉三⾓有⼏种⽅法:暴⼒解法:直接规律挨个计算并打印出来。(不推荐,效率奇低)
创建数组:上⾯给的打印⽰例不好看出规律,我们把他排序看看,如下图。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。