练习7-8 方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 #include<string.h> 5 int main() { 6 int n = 0; 7 int m = 0; 8 int** a; 9 scanf("%d%d", &m, &n); 10 a = (int**)malloc(n * sizeof(int*)); 11 for (int i = 0; i < n; i++) { 12 a[i] = (int*)malloc(n * sizeof(int)); 13 for (int j = 0; j < n; j++) { 14 scanf("%d", &a[i][j]); 15 } 16 } 17 18 m = m % (2 * n); //举个例子,99 和 4 肯定要先99%8=3 19 m = abs(m - n); //向左 m 个单位长度 20 //m %= n; //可能值很大,我们需要把他们缩小到<n的范围 21 22 for (int i = 0; i < n; i++) { 23 for (int j = m; j < n; j++) { 24 printf("%d ", a[i][j]); 25 } 26 for (int j = 0; j < m; j++) { 27 printf("%d ", a[i][j]); 28 } 29 printf("\n"); 30 31 } 32 /*for (int i = 0; i < n; i++) { 33 for (int j = 0; j < n; j++) { 34 printf("%d ", a[i][j]); 35 } 36 printf("\n"); 37 }*/ 38 return 0; 39 }
做了这个题目,我才深深意识到了,数学逻辑以及数学模型的重要性。!!!
我希望大家在做题之前,先算,算各种情况它对应的数值,怎么算出来的,把他用代码表示就ok啦!!