NUC1937 B.函数
时间限制: 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;
}
浙公网安备 33010602011771号