题目:
输入一个正整数n,输出一个n阶的平方矩阵。
例如:
输入:5
输出:
1 4 9 16 25
4 9 16 25 1
9 16 25 1 4
16 25 1 4 9
25 1 4 9 16
解题思路:
本题我分别采用一维数组和二维数组来实现。
一维数组:采用一维数组输出矩阵的形式,我考虑的是一行一行的进行输出,输出一次进行一次一位数组的移动,然后再进行输出,重复这个过程。
二维数组:利用二维数组实现的过程中,我主要观察输出结果找规律实现。因为采用的是二维数组,所以我找到行标、列标与对应值的关系:a[i][j] =(i+j+1)*(i+j+1),这个规律适用于矩阵的副对角线之上的元素。在矩阵的副对角线之下,元素同样可以表示为a[i][j] = k * k的形式,但此时的k = (i+j+1)%n。
程序代码:
使用一位数组实现:
#include <stdio.h>
//一维数组实现平方矩阵
int main(int argc, char *argv[])
{ int n, i, temp, j;printf("你想输出几行几列的平方矩阵:");scanf("%d",&n);int a[n];for(i = 0; i < n; i++){//赋值a[i] = (i+1) * (i+1);}for(j = 0; j < n; j++){//移动次数if(j > 0){temp = a[0];//取第一个元素for(i = 0; i < n - 1; i++){//移动a[i] = a[i+1];}a[n-1] = temp;}//将第一个元素移动到最后一个位置for(i = 0; i < n; i++){//输出printf("%d ",a[i]);}putchar('\n');}return 0;
}
使用二维数组实现:
#include <stdio.h>
//二维数组输出平方矩阵
int main(int argc, char *argv[])
{ int n, i, j, k;printf("你想输出几行几列的平方矩阵:");scanf("%d",&n);int a[n][n];for(i = 0; i < n; i++){for(j = 0; j < n; j++){k = i + j + 1;if(i + j >= n){//取余修正输出结果k %= n;}a[i][j] = k * k;printf("%d ",a[i][j]);}putchar('\n');}return 0;
}
运行结果:
你想输出几行几列的平方矩阵:5
1 4 9 16 25
4 9 16 25 1
9 16 25 1 4
16 25 1 4 9
25 1 4 9 16
你想输出几行几列的平方矩阵:10
1 4 9 16 25 36 49 64 81 100
4 9 16 25 36 49 64 81 100 1
9 16 25 36 49 64 81 100 1 4
16 25 36 49 64 81 100 1 4 9
25 36 49 64 81 100 1 4 9 16
36 49 64 81 100 1 4 9 16 25
49 64 81 100 1 4 9 16 25 36
64 81 100 1 4 9 16 25 36 49
81 100 1 4 9 16 25 36 49 64
100 1 4 9 16 25 36 49 64 81