NUC1937 B.函数

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;
}






原文地址:https://www.cnblogs.com/tigerisland/p/7563882.html