#循环输入。每组数据先输入一个n(n≤10),然后n行n列数据代表一个矩阵,每个数据为一个整数,然后再给出一个数字R,输出这个矩阵按照顺时针旋转90R度以后的矩阵。当没有任何输入时,程序结束。
代码思路:90度,180度,270度,360度实际上是分别进行一次九十度反转,两次九十度反转,三次九十度反转,四次九十度反转。那么对进行一次九十度反转进行研究,发现二维数组的下标进行了如下变化,a[i][j]->a[j][i-1-j];
#include <stdio.h>
#define maxn 10
void clockwiseRotate90(int n;int mat[maxn][maxn]){
int tmp[maxn][maxn];//临时矩阵
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
tmp[j][i-1-j]=mat[i][j];
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
mat[i][j]=tmp[i][j];
}
}
}
int main(){
int n,R;
int i,j;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&mat[i][j]);
}
}
scanf("%d",&R);
R=R%4;
for(i=0;i<R;i++)
{
clockwiseRotate90(n,mat);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(j)
{printf(" ");
}
}
printf("\n");
}
}
return 0;
}
#循环输入。每组数据总共输入两个矩阵,每个矩阵先输入n和m,然后再输入一个n×m的矩阵。输出这两个矩阵的乘积,如果不存在则输出NULL。当没有任何输入时,程序结束。
#include <stdio.h>
#define maxn 101
int matA[maxn][maxn], matB[maxn][maxn];
int matRet[maxn][maxn];
void inputMatrix(int n, int m, int mat[maxn][maxn]) {
int i, j;
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
scanf("%d", &mat[i][j]); // (1)
}
}
}
void outputMatrix(int n, int m, int mat[maxn][maxn]) {
int i, j;
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
if(j) {
printf(" ");
}
printf("%d", mat[i][j]); // (2)
}
puts("");
}
}
void multiplyMatrix(int a, int b, int matA[maxn][maxn], int c, int d, int matB[maxn][maxn], int matRet[maxn][maxn]) {
// assert(b == c);
int i, j, k;
for(i = 0; i < a; ++i) {
for(j = 0; j < d; ++j) {
matRet[i][j] = 0;
for(k = 0; k < b; ++k) {
matRet[i][j] += matA[i][k] * matB[k][j]; // (3)
}
}
}
}
int main() {
int a, b, c, d;
while(scanf("%d %d", &a, &b) != EOF) {
inputMatrix(a, b, matA);
scanf("%d %d", &c, &d);
inputMatrix(c, d, matB);
if(b != c) {
printf("NULL\n");
}else {
multiplyMatrix(a, b, matA, c, d, matB, matRet);
outputMatrix(a, d, matRet);
}
}
return 0;
}