日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谭浩强课后题(数组篇)

發布時間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谭浩强课后题(数组篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譚浩強課后題(數組篇)

  • 用篩法求素數
  • 冒泡排序
  • 逆序存放數組元素
  • 奇數階魔方

用篩法求素數

代碼:

#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; }

逆序存放數組元素

這里的方法是:雙指針
代碼:

#include<stdio.h> #include<string.h> #define N 1000 int prime[N]; int a[N];void swap(int* x, int* y) //交換元素 {int tem;tem = *x;*x = *y;*y = tem; } int main() {int n;scanf_s("%d", &n);for(int i=0;i<n;++i)scanf_s("%d", &a[i]);int left = 0, right = n - 1;while (left <= right)swap(&a[left++], &a[right--]);for (int i = 0; i < n; ++i)printf("%d ", a[i]);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; } } //輸出 ,這個就不用我寫了把 }}

總結

以上是生活随笔為你收集整理的谭浩强课后题(数组篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。