时间限制: 1000ms 内存限制: 65535KB
问题描述
请编程完成将数组中的数循环移动n个位置(正整数表示右移,负数表示左移,数值表示移动的位置间距),main函数调用其他函数,完成以下功能1)函数1:键盘输入10个数到数组;2)函数2:对这个数组完成移动(使用2个参数:移动距离、移动的数组)3)函数3:输出这10个数
输入描述
第一行仅一个整数n(-1000≤n≤1000);第二行为10个由空格分开的整数。
输出描述
这些整数循环移动n个位置后的结果,每两个数字由一个空格隔开。
样例输入
30 1 2 3 4 5 6 7 8 9
样例输出
7 8 9 0 1 2 3 4 5 6
问题分析:
数据移位问题,真的移动数据会后悔的,时间代价太大了。
考虑下标移位就可以了。
模除运算结果就会产生循环,题意中是循环移位。
程序说明:
程序代码尽量写的更加具有通用性。本题数据是10个,代码中的函数对于任意个数据都是适用的。
函数数input(int n, int a[])的功能是输入n个数到数组a中。
函数shift(int pos, int n, int maxn)的功能是从当前下标pos移动n个位置(数据总数为maxn),得到的结果是移动后下标的位置。
函数output(int pos, int a[], int maxn)的功能是从下标pos开始输出循环输出数组a中的值(数据总数为maxn)。
需要注意的是,如果输入的n为正数则左移,否则右移。
题记:
写一个程序并不难,难的是写通用的程序。这是职业程序员不懈的追求。
参考链接:(略)
AC的C++程序如下:
#include <iostream> using namespace std; const int N = 10; int a[N]; void input(int n, int a[]) { for(int i=0; i<n; i++) cin >> a[i]; } int shift(int pos, int n, int maxn) { int shift; shift = (pos - n) % maxn; if(shift < 0) shift += maxn; return shift; } void output(int pos, int a[], int maxn) { for(int i=0; i<maxn; i++) if(i == 0) cout << a[(pos + i) % maxn]; else cout << " " << a[(pos + i) % maxn]; cout << endl; } int main() { int n, pos; cin >> n; input(N, a); pos = shift(0, n, N); output(pos, a, N); return 0; }