当前位置:
首页 >
谭浩强课后题(数组篇)
发布时间:2025/3/19
28
豆豆
生活随笔
收集整理的这篇文章主要介绍了
谭浩强课后题(数组篇)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
谭浩强课后题(数组篇)
- 用筛法求素数
- 冒泡排序
- 逆序存放数组元素
- 奇数阶魔方
用筛法求素数
代码:
#include<stdio.h> #include<string.h> #define N 110 int prime[N];void primes() {memset(prime, 1, sizeof(prime));prime[0] = prime[1] = 0;for (int i = 2; i < N; ++i){if (prime[i])for (int j = 2 * i; j < N; j += i)prime[j] = 0;} }int main() {primes();for (int i = 1; i <= 100; ++i)if (prime[i])printf("%d ", i);return 0; }冒泡排序
冒泡排序
#include <string.h> #include <malloc.h> #include <stdio.h> #include <math.h>#define maxn 1000void swap(int* x, int* y) //交换元素 {int tem;tem = *x;*x = *y;*y = tem; }void show(int* arr, int n) {for (int i = 0; i < n; i++)printf_s("%d ", arr[i]);printf_s("\n"); }void selectsort(int* arr, int key, int n) {// 1 是升序,0是降序int m;//中间得过渡标记if (key)//升序{for (int i = 0; i < n - 1; i++)//只用比较n-1次{m = i; //如第一次选好最小后,最小的位置就不能动了,所以用接下来的一位来比较选出次小的,m作用是标记住所需要的元素的位置for (int j = i + 1; j < n; j++)if (arr[j] < arr[m])//从比较的位置后一个开始m = j;//,如果后边的位置小,因为m要选小的,所以m更新if (m != i)//当后边有比前边的值小时再交换swap(&arr[i], &arr[m]);show(arr, n);}}else//降序{for (int i = 0; i < n - 1; i++){m = i;for (int j = i + 1; j < n; j++)if (arr[j] > arr[m])m = j;if (m != i)swap(&arr[i], &arr[m]);show(arr, n);}} } int main() {int arr[maxn] = {};//默认初始化int n;scanf("%d", &n);for (int i = 0; i < n; i++)scanf_s("%d", &arr[i]);//BubbleSort(arr, 1,n);selectsort(arr, 1, n);return 0; }逆序存放数组元素
这里的方法是:双指针
代码:
奇数阶魔方
题目
魔方是n x n 的矩阵,每个单元取整数值,范围从1到n2 ,要求每行每列,以及两条对角线的和都相等。下图所示为 n = 5 的魔方,相等的和数是65。
问题分析
不难发现:
- (1)由于是正规魔方,故填入的 n2 个不同整数依次为1,2,3,….n°。
- (2)各行、列和对角线上的数字虽各不相同,但其和却是相同的。这表明,其魔方常数可由公式 n(n2+1)/2 得到。
- (3)数字在阵列中的次序并没有遵从阵列单元的行、列下标的顺序,但数字1却始终出现在阵列第一行的正中间位置,而数字 n2 也始终出现在阵列第n行的正中间位置,这说明阵列中的数字排列是有一定规律的。
规律
-
(1)自然数1出现在第一行的正中间。
-
(2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行),且列数加1(列数右移一列)。
-
(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧。
-
(4)一般地,下一个数字在前一个数字的右上方(行数少 1,列数加1)。
-
(5)若应填的地方已经有数字或在方阵外,则下一个数字就填在前一个数字的下方(一般地,n的倍数的下一个数字在该数的下方)。
代码:
#include<stdio.h> #include<strinh.h>int main() { int u; int x,y,n,i,j; int num[22][22]; scanf("%d",&u); while(u--) { scanf("%d",&n); memset(num,-1,sizeof(num)); x = 1; y = n/2 +1; for(i=1;i<=n;++i) { num[x][y] = i; x--; // 依次斜上 y++; if(x==0&&y==n+1) { x +=2; y--; } else if(num[x][y]!=-1) { x+=2; y--; } else if(x==0&&y!=n+1) { x=n; } else if(x!=0&&y==n+1) { y=1; } } //输出 ,这个就不用我写了把 }}总结
以上是生活随笔为你收集整理的谭浩强课后题(数组篇)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 螺旋矩阵(逆时针)
- 下一篇: 快乐数(双指针,哈希表)