[每日一道算法题(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);
}
***
閱讀更多 編程反思錄 的文章