习题36
求100之内的素数。
实现思路:
使用函数实现,并循环遍历依次判断。
代码如下:
#include <stdio.h> #include <math.h> int main(){ int isPrime(int n); int i, count = 0; for(i = 2; i < 101; i++){ if(isPrime(i)){ count++; printf("%5d", i); if(count % 5 == 0){ printf("\n"); } } } return 0; } int isPrime(int n){ int i, prime = 1; for(i = 2; i <= sqrt(n); i++){ if(n % i == 0){ prime = 0; break; } } return prime; }
打印:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
习题37
对10个数进行排序。
实现思路:
可使用冒泡法或其他方法对数进行排序,一般都需要经过交换过程。
代码如下:
#include <stdio.h> int main(){ void sort(int ua[], int l); int i, unsorted_list[] = {12, 54, 81, 3, 72, 47, 99, 32, 41, 62}, *p; printf("Unsorted:\n"); for(i = 0; i < 10; i++){ printf("%d ", unsorted_list[i]); } p = unsorted_list; int length = sizeof(unsorted_list) / sizeof(unsorted_list[0]); sort(p, length); printf("\nAfter sorted:\n"); for(i = 0; i < 10; i++){ printf("%d ", unsorted_list[i]); } return 0; } void sort(int ua[], int l){ int i, j, temp; for(i = l - 2; i >= 0; i--){ for(j = 0; j <= i; j++){ if(ua[j] > ua[j + 1]){ temp = ua[j]; ua[j] = ua[j + 1]; ua[j + 1] = temp; } } } }
打印:
Unsorted: 12 54 81 3 72 47 99 32 41 62 After sorted: 3 12 32 41 47 54 62 72 81 99
习题38
求一个3*3矩阵对角线元素之和。
实现思路:
利用双重for循环控制输入二维数组,再将i和j相同的数组元素累加后输出。
代码如下:
#include <stdio.h> int main(){ int a[3][3] = {0}, i, j, sum = 0; printf("Please input the 9 numbers:\n"); for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ scanf("%d", &a[i][j]); } } for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ if(i == j){ sum += a[i][j]; } } } printf("Sum = %d\n", sum); return 0; }
打印:
Please input the 9 numbers: 1 2 3 4 5 6 7 8 9 Sum = 15 • 1 • 2 • 3 • 4
习题39
有一个已经排好序的数组。
现输入一个数,要求插入后该数组还是有序的。
实现思路:
先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
代码如下:
#include <stdio.h> int main(){ int a[11] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 0}, num, i, j; printf("Please input the number to insert:\n"); scanf("%d", &num); if(num >= a[9]){ a[10] = num; }else{ i = 9; while(a[i] > num){ i--; } for(j = 10; j > i + 1; j--){ a[j] = a[j - 1]; } a[i + 1] = num; } for(i = 0; i < 11; i++){ printf("%d ", a[i]); } return 0; }
打印:
Please input the number to insert: 50 1 4 9 16 25 36 49 50 64 81 100 • 1 • 2 • 3
习题40
将一个数组逆序输出。
实现思路:
将数组均分成两半,用前后对应位置的元素交互即可。
也可以通过两个数组,前后位置的元素交换。
代码如下:
#include <stdio.h> #define N 10 int main(){ int a[N] = {1, 4, 9, 16, 25, 36, 49, 64, 81, 100}, num, i, j, temp; printf("Normal order:\n"); for(i = 0; i < 10; i++){ printf("%d ", a[i]); } for(i = 0; i < N / 2; i++){ temp = a[i]; a[i] = a[ N - 1 - i]; a[ N - 1 - i] = temp; } printf("\nReversed order:\n"); for(i = 0; i < 10; i++){ printf("%d ", a[i]); } return 0; }
打印:
Normal order: 1 4 9 16 25 36 49 64 81 100 Reversed order: 100 81 64 49 36 25 16 9 4 1