一个很简单数学问题,但是你能把你的方法告诉计算机吗?



一个很简单数学问题,但是你能把你的方法告诉计算机吗?


[每日一道算法题(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>
一个很简单数学问题,但是你能把你的方法告诉计算机吗?

***

一个很简单数学问题,但是你能把你的方法告诉计算机吗?

关注我,让编程变得简单

一个很简单数学问题,但是你能把你的方法告诉计算机吗?


分享到:


相關文章: