關於C語言一維數組算法問題詳解
問題1:將數組中的數逆序存放
本題要求編寫程序,將給定的n個整數存入數組中,將數組中的這n個數逆序存放, 再按順序輸出數組中的元素。
算法描述:1.向數組a中輸入元素;
2.定義一個新數組new,將數組a中的元素倒序存放;
3.將數組b正序輸出,註意結尾無空格的格式問題。
代碼實現 :
#include <stdio.h> int main() { int n; scanf("%d",&n); int i,arr[n]; for(i = 0;i < n;i++) { scanf("%d",&arr[i]); } int new[n],j; //定義一個數組new用來存入數組a的逆順序 for(int j = 0;j < n;j++) { new[j] = arr[n-1-i]; //倒序存入 } for(int k = 0;k < n - 1;k++) //數組中最後一個元素不一起輸入,保持結尾無空格 { printf("%d ",new[k]); } printf("%d",new[n-1]); //輸出最後一個元素 return 0; }
運行結果:
問題2:求數組中最大值及其下標
本題要求編寫程序,找出給定的n個數中的最大值及其對應的最小下標(下標從0開始)。 輸入格式: 輸入在第一行中給出一個正整數n(1<n≤10)。第二行輸入n個整數,用空格分開。 輸出格式: 在一行中輸出最大值及最大值的最小下標,中間用一個空格分開。
算法描述:1.向數組中存放元素;
2.把數組中第一個元素先定義一個變量保存住;
3.遍歷數組,如果比保存第一個元素的變量大,那就賦值給那個變量,直到變量值變為最大;
4.定義一個變量用來記錄最大值的下標。
代碼實現:
#include <stdio.h> int main() { int n; scanf("%d",&n); int arr[n],i; for(i = 0;i < n;i++) { scanf("%d",&arr[i]); } int max = arr[0]; //定義一個變量保存數組第一個元素 for(int j = 1;j < n;j++) { if(max < arr[j]) //如果小於就一直給m,直到找到最大值停 { max = arr[j]; } } for(int num = 0;num < n;num++) //記錄最大值下標操作 { if(arr[num] == max) { printf("最大值為:%d\n其下標為:%d",max,num); break; } } return 0; }
運行結果:
問題3:找出不是兩個數組的共有元素
本題要求給定兩個整型數組,本題要求找出不是兩者共有的元素。
算法描述:1.分別定義兩數組並輸入值;
2.用數組a中元素對比數組b中元素,非共有值放入c中(此處可以用一個 標志變量flag,標志 是否有共有值);
3.用數組b中元素對比數組a中元素,重復“2”操作;
4.最後先輸出數組c中第一個元素,然後判斷元素是否與之前錄入元素
重復。
5.最後打印出來數組c中的元素,也就是非共有值,此處註意格式問題。
代碼實現:
#include <stdio.h> int main() { int n; scanf("%d",&n); int arr1[n],i; //定義第一個數組 for(i = 0;i < n;i++) { scanf("%d",&arr1[i]); } int m; scanf("%d",&m); int arr2[m],j; //定義第二個數組 for(j = 0;j < m;j++) { scanf("%d",&arr2[j]); } int k,rem[20] = {}; //數組rem是用來記錄非公有值的 for(i = 0;i < n;i++) { int flag = 0; //定義標志變量用來標志是否有非共有值 for(j = 0;j < m;j++) { if(arr1[i] == arr2[j]) //用數組1中元素對比數組2中元素,非共有值放入數組rem中 { flag = 1; } } if(flag == 0) { rem[k] = arr1[i]; k++; } } for(i = 0;i < m;i++) //用數組2中元素對比數組1中元素,非共有值放入數組rem中 { int flag = 0; for(j = 0;j < n;j++) { if(arr2[i] == arr1[j]) { flag = 1; } } if(flag == 0) { rem[k] = arr2[i]; k++; } } printf("非共有元素:%d",rem[0]); //輸出rem中第一個元素 for(i = 1;i < k;i++) { for(j = 0;j < i;j++) { if(rem[i] == rem[j]) { break; } } if(j >= i) { printf(" %d",rem[i]); //因為提前輸出第一個元素,所以後面要打一個空格再打元素, //結尾無空格的格式問題 } } return 0; }
運行結果:
問題4:找出出現次數最多的數
本題要求統計一個整型序列中出現次數最多的整數及其出現次數。
輸入格式: 輸入在一行中給出序列中整數個數N(0<N≤1000),以及N個整數。數字間以空格分隔。
輸出格式: 在一行中輸出出現次數最多的整數及其出現次數,數字間以空格分隔。題目保證這樣的數字是唯一的。
算法描述:1.定義兩個數組,一個用來存放元素,另一個用來當計數器,此數組註意需 要初始化;
2.在這個數組中找到重復的,然後把計數器數組賦值+1;
3.一直遍歷找到重復最多的,找到後把計數器數組元素賦值給變量max(也 就是出現次 數),計數器數組下標就是出現次數最多數的下標。
代碼實現:
#include <stdio.h> int main() { int n,arr[1000],cnt[1000] = {0}; //cnt為計數器數組,需要初始化 int i,j,k,max = 0; scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%d",&arr[i]); } for(i = 0;i < n;i++) { for(j = 0;j < n;j++) { if(arr[i] == arr[j]) //找到一樣的 { cnt[i] = cnt[i] + 1; //cnt[i]++ } } } for(i = 0;i < n;i++) { if(max < cnt[i]) //一直遍歷直到找重復最多的 { max = cnt[i]; //找到後賦值給max k = i; //i就是重復最多的數的下標 } } printf("出現次數最多的數字為:%d\n其出現次數為:%d",arr[k],max); return 0; }
運行結果:
問題5:數組中插入數字並排序
本題要求給出n個元素的數組,從小到大排列,再輸入一個num,插入到數組中, 使得新數組依舊是從小到大的順序(用一個數組完成)。
算法描述:1.定義一個數組並存放元素,單獨記錄好倒數第二個元素;
2.輸入要插入的數字,註意可以考慮特殊情況,如果插入的數大於原本倒數 第二個數,就可以 直接插入賦值為最後一個元素;
3.再來考慮一般情況,遍歷數組,如果原本的數大於要插入的數,先保存住 原來的數字,然 後把插入的數放入到原來的數的位置;
4.插入之後,原本的數就到瞭後一位,需要把後一位的位置保存住,把原本 的數放到後一 位,再把位置賦上原本數的值;
5.最後遍歷輸出數組元素 。
代碼實現 :
#include <stdio.h> int main() { int n,i,j; scanf("%d",&n); int arr[n],t1,t2,num,end; for(i = 0;i < n;i++) { scanf("%d",&arr[i]); } scanf("%d",&num); //輸入要插入的數字 end = arr[n-1]; //保存倒數第二個元素 if(num > end) //考慮特殊情況,如果插入的數大於倒數第二個 { arr[n] = num; //直接插入賦值 } else { for(i = 0;i < n;i++) { if(arr[i] > num) //如果原本的數大於插入的數 { t1 = arr[i]; //先保存原來的數 arr[i] = num; //把插入的數放到原來數的位置 for(j = i + 1;j <= n;j++) //處理原來的數 { t2 = arr[j]; //原來的數到瞭後一位保存住 arr[j] = t1; //把原來的數賦值給現在要存的這個位置上 t1 = t2; } break; } } } for(i = 0;i <= n;i++) //註意這裡i<=n,因為多插入瞭一個數字 { printf("%d ",arr[i]); } return 0; }
運行結果:
問題6:數組循環右移問題
一個數組A中存有N(>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(≥0)個位置,即將A中的數據由(A0A1⋯*AN−1)變換為(AN−M⋯AN−1A0A1⋯AN−M−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.然後再註意格式問題,打印出除最後一個以外的數字+空格,最後在打印 最後一個數。
代碼實現:
#include <stdio.h> int main() { int n,move; scanf("%d %d",&n,&move); int arr[n],i; for(i = 0;i < n;i++) { scanf("%d",&arr[i]); } move %= n; //取餘算出到底移動多少,進行簡化 if(move == 0) //特殊情況特殊處理 { for(i = 0;i < n - 1;i++) { printf("%d",arr[i]); //註意格式問題 } printf("%d",arr[n-1]); return 0; } for(i = n - move;i < n;i++) //移動move,把最後move個數放前面 { printf("%d ",arr[i]); } for(i = 0;i < n - move - 1;i++) //把剩下除瞭最後一個數,打印出來 { printf("%d ",arr[i]); } printf("%d",arr[n-1-move]); //最後一個沒空格 return 0; }
運行結果:
總結
到此這篇關於關於C語言一維數組算法問題的文章就介紹到這瞭,更多相關C語言一維數組算法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!