![一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?](http://p2.ttnews.xyz/loading.gif)
[每日一道算法題(C)]
山東理工OJ 2019級程序設計基礎 l (2019秋季) 題目編號:1523
矩陣輸出
Problem Description
輸入n個整數,輸出由這些整數組成的n行矩陣。
Input
第一行輸入一個正整數N(N <= 20),表示後面要輸入的整數個數。下面依次輸入N個整數。
Output
以輸入的整數為基礎,輸出有規律的n行數據。
Sample Input
53 6 2 5 8
Sample Output
3 6 2 5 88 3 6 2 55 8 3 6 22 5 8 3 66 2 5 8 3
1.觀察規律2.
思路:對於這N個序列來說,每次的變化只是將最後一個數放到序列的第一位。1.我們可以用臨時變量存儲最後一個數的值2.然後讓數組從 倒數第二個數 開始到 數組首位 結束 依次“向後移動一位”,也就是 a[N - 2] = a[N - 1]3.最後將臨時變量所存儲的數組最後一位元素的值 賦給 數組 首元素
分析到這裡其實這道題已經可以完成了,但是如果我只想要這個輸出的矩陣的某一行呢?其實這個問題用上面的思路也是可以做的,就是需要多循環幾次。如果我想一步就得到這個數組呢?
我們用 N = 5 來舉例觀察題幹中的輸出樣例,第一行是沒有改變的,一共是 5 行1.我們可以創建一個和原數組同樣大小的臨時數組,將原來的數組分成兩部分。2.第一部分是從 要放到數組首位的元素位置 到 數組最後一個元素3.第二部分是從 數組首元素開始 到 要放到數組首位的元素前一位
<code>#include<stdio.h>
voidmatrix(int*arr,intn);//上題的解法看這個函數
voidmatrix_any(int*arr,intN,intn);//得到你想要的順序哪一行看這裡
intmain(){
intN=0;
inti=0;
scanf("%d",&N);
int*arr=(int*)malloc(sizeof(int)*N);
for(i=0;iscanf("%d",&arr[i]); /<stdio.h>/<code>
matrix(arr,N);//這種方法更加高效
printf("\\nwantonerowonly:inputarow\\n");
intn=0;
scanf("%d",&n);
matrix_any(arr,N,n);
free(arr);
return0;
}
voidmatrix(int*arr,intn){
inti,j,k;
int*tmp=(int*)malloc(sizeof(int)*n);//創建臨時數組,保證不改變arr數組的原始順序
for(i=0;itmp[i]=arr[i];
for(i=0;iif(i!=0){
k=tmp[n-1];//放到首位的數
for(j=n-2;j>=0;j--){
tmp[j+1]=tmp[j];
}
tmp[0]=k;
}
for(j=0;jprintf("%d",tmp[j]);
printf("\\n");
}
}
voidmatrix_any(int*arr,intN,intn){
inti,j,k;
int*tmp=(int*)malloc(sizeof(int)*N);
for(j=N-n+1,k=0;jtmp[k]=arr[j];
for(j=0;N-k>0;j++,k++)
tmp[k]=arr[j];
for(k=0;kprintf("%d",tmp[k]);
printf("\\n");
free(tmp);
}
![一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?](http://p2.ttnews.xyz/loading.gif)
***
關注我,讓編程變得簡單
閱讀更多 編程反思錄 的文章