比较好的营销网站,推广普通话的顺口溜,免费建站的站点网站,东莞公司注册服务平台题目
练习7-8 方阵循环右移 (20 分) 本题要求编写程序#xff0c;将给定nn方阵中的每个元素循环向右移m个位置#xff0c;即将第0、1、⋯、n−1列变换为第n−m、n−m1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式#xff1a; 输入第一行给出两个正整数m和n#xff08;1≤…题目
练习7-8 方阵循环右移 (20 分) 本题要求编写程序将给定n×n方阵中的每个元素循环向右移m个位置即将第0、1、⋯、n−1列变换为第n−m、n−m1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式 输入第一行给出两个正整数m和n1≤n≤6。接下来一共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
分析
本体循环右移类似一个环右移长度超过环的长度将从环尾移到环头。右移长度超过环的长度列标从j变成p(jm)%n。右移长度小于等于环的长度列标j变成jm。注意等于的时候也是jm。
一开始考虑直接对这个数组进行处理逐列判断两两交换初始的数据和右移后的数据但是后来发现两两交换时可能不需要进行到最后一列就已经全部右移完毕此时如果再交换会导致将正确的位置打乱。
所以增加了一个数组用来表示交换后的数组b。将原数组a[i][j]下标中的元素放到b数组里合适的位置。
代码
#includestdio.hint main(){int m,n,i,j,a[9][9],k,p,b[9][9];//a存初始数组b是右移后的数组scanf(%d %d,m,n);if(mn) mm%n;//移动的距离m如果大于数组列数n需要对m处理for(i0;i9;i){//数组初始化for(j0;j9;j){a[i][j]0;b[i][j]0;}}for(i1;in;i){for(j1;jn;j){scanf(%d,a[i][j]);}}for(i1;in;i){for(j1;jn;j){if(jmn) {//如果移动的距离超过了数组的大小进行取余p(jm)%n;}else pjm;//移动的距离小于等于数组的大小b[i][p]a[i][j];}}for(i1;in;i){for(j1;jn;j){printf(%d ,b[i][j]);}printf(\n);}
}