对你有帮助就点个赞吧,谢谢各位
[每日一道算法题(C)]
山东理工OJ 2019级程序设计基础 l (2019秋季) 题目编号:1523
矩阵输出
Problem Description
输入n个整数,输出由这些整数组成的n行矩阵。
Input
第一行输入一个正整数N(N <= 20),表示后面要输入的整数个数。
下面依次输入N个整数。
Output
以输入的整数为基础,输出有规律的n行数据。
Sample Input
5
3 6 2 5 8
Sample Output
3 6 2 5 8
8 3 6 2 5
5 8 3 6 2
2 5 8 3 6
6 2 5 8 3
1.观察规律
2.思路:
对于这N个序列来说,每次的变化只是将最后一个数放到序列的第一位。
1.
我们可以用临时变量存储最后一个数的值
2.
然后让数组从倒数第二个数
开始到数组首位
结束 依次“向后移动一位”,也就是a[N - 2] = a[N - 1]
3.
最后将临时变量所存储的数组最后一位元素的值 赋给 数组 首元素
分析到这里其实这道题已经可以完成了,但是如果我只想要这个输出的矩阵的某一行呢?
其实这个问题用上面的思路也是可以做的,就是需要多循环几次。如果我想一步就得到这个数组呢?
我们用 N = 5 来举例
观察题干中的输出样例,第一行是没有改变的,一共是 5 行
1.
我们可以创建一个和原数组同样大小的临时数组,将原来的数组分成两部分。
2.
第一部分是从 要放到数组首位的元素位置 到 数组最后一个元素
3.
第二部分是从 数组首元素开始 到 要放到数组首位的元素前一位
#include<stdio.h>
void matrix(int* arr, int n);//上题的解法看这个函数
void matrix_any(int* arr, int N, int n);//得到你想要的顺序哪一行看这里
int main() {
int N = 0;
int i = 0;
scanf("%d", &N);
int* arr = (int*)malloc(sizeof(int) * N);
for (i = 0; i < N; i++)
scanf("%d", &arr[i]);
matrix(arr, N);//这种方法更加高效
printf("\nwant one row only: input a row\n");
int n = 0;
scanf("%d", &n);
matrix_any(arr, N, n);
free(arr);
return 0;
}
void matrix(int* arr, int n) {
int i, j, k;
int* tmp = (int*)malloc(sizeof(int) * n);//创建临时数组,保证不改变arr数组的原始顺序
for (i = 0; i < n; i++)
tmp[i] = arr[i];
for (i = 0; i < n; i++) {
if(i != 0){
k = tmp[n - 1];//放到首位的数
for (j = n - 2; j >= 0; j--) {
tmp[j + 1] = tmp[j];
}
tmp[0] = k;
}
for (j = 0; j < n; j++)
printf("%d ", tmp[j]);
printf("\n");
}
}
void matrix_any(int* arr, int N, int n) {
int i, j, k;
int* tmp = (int*)malloc(sizeof(int) * N);
for (j = N - n + 1, k = 0; j < N; j++, k++)
tmp[k] = arr[j];
for (j = 0; N - k > 0; j++, k++)
tmp[k] = arr[j];
for (k = 0; k < N; k++)
printf("%d ", tmp[k]);
printf("\n");
free(tmp);
}

网友评论