一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?



一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?


[每日一道算法題(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]);

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);
}
/<stdio.h>/<code>
一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?

***

一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?

關注我,讓編程變得簡單

一個很簡單數學問題,但是你能把你的方法告訴計算機嗎?


分享到:


相關文章: