阵列中数字的特殊逆转

时间:2017-08-30 10:48:37

标签: c++ arrays logic

我遇到了一个问题,我无法编写正确的所需代码。 问题是:数字输入数组,我必须显示反转输出。但输出有一个特殊的模式。特殊模式在Eg:output中给出。

例如:输入1 2 3 4 5 6 7 8

输出4 3 2 1 8 7 6 5

int main()
{
    int a[20],i,j,n,l;
    cout<<"ENTER NO. OF ELEMENTS: ";
    cin>>n;

    for(i=0; i<n; i++)
    {
            cout<<"ENTER : ";
            cin>>a[i];
    }
    l=(n/2)-1;
    for(i=0,j=l; i<n/2,j>=0; i++,j--)
    {
            a[i]=a[i]+a[j];
            a[j]=a[i]-a[j];
            a[i]=a[i]-a[j];
    }
        for(i=n/2,j=n-1; i<n,j>=n/2; i++,j--)
    {
            a[i]=a[i]+a[j];
            a[j]=a[i]-a[j];
            a[i]=a[i]-a[j];
    }
    for(i=0; i<n; i++)
    {
            cout<<a[i];
    }
    return 0; 
}

给定代码上面的问题是它显示原始数组而不是所需的输出。因此,如果有人可以指出我的代码中的错误或错误。

1 个答案:

答案 0 :(得分:0)

首先要做的事情。始终初始化变量并始终尝试准确地声明何时使用它们:

int a[20],i,j,n,l;

这里的数组有垃圾值,以及之后声明的变量。您应首先使用空值初始化数组:

int a[20] {};
cout << "ENTER NO. OF ELEMENTS: ";
int n = 0;
cin >> n;

当你第一次使用它们时,其余的变量:

for(int i = 0; i < n; i++)
{
    cout << "ENTER : ";
    cin >> a[i];
}

int l = (n / 2) - 1;

现在这些代码行:

a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];

那些应该交换两个值,但是第一眼看上去并不容易理解。你最好编写一个交换两个值甚至更好的函数:使用标准值std::swap

swap(a[i], a[j]);

现在,你的算法错了。这行代码for(i=0,j=l; i<n/2,j>=0; i++,j--)的结束条件有误。你几乎可以将所有元素反转两次。你应该停在上半部分(l / 2)的中间而不是整个数组的中间位置(n / 2)。

for (int i = 0, j = l; i <= l / 2 && j > l / 2; i++, j--)

以下条件相同。

for (int i = n / 2, j = n - 1; i <= (n + l) / 2 && j > (n + l) / 2; i++, j--)

所以你的最终代码看起来像这样:

#include <iostream>
using namespace std;

int main()
{
    int a[20] {};
    cout << "ENTER NO. OF ELEMENTS: ";
    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        cout << "ENTER : ";
        cin >> a[i];
    }

    int l = (n / 2) - 1;

    for (int i = 0, j = l; i <= l / 2 && j > l / 2; i++, j--)
        swap(a[i], a[j]);

    for (int i = n / 2, j = n - 1; i <= (n + l) / 2 && j > (n + l) / 2; i++, j--)
        swap(a[i], a[j]);

    for (int i = 0; i < n; i++)
        cout << a[i] << ' ';

    return 0;
}

现在,问题是代码也不是非常易读,而且由于您使用的是C ++,很遗憾您没有使用它拥有的标准算法。 此外,您的变量名称不具有描述性,因此代码将难以维护。

#include <iostream>
#include <algorithm>

int main()
{
    const int MaxNumbers = 20;
    int numbersToInverse[MaxNumbers] {};

    int elementCount = 0;
    std::cin >> elementCount;

    for (int i = 0; i < elementCount; i++)
        std::cin >> numbersToInverse[i];

    int middleOfVector = elementCount / 2;

    std::reverse(numbersToInverse, numbersToInverse + middleOfVector);
    std::reverse(numbersToInverse + middleOfVector, numbersToInverse + elementCount);

    for (int i = 0; i < elementCount; i++)
        std::cout << numbersToInverse[i] << ' ';

    return 0;
}

当然,更好的实现将是std::vector,但我保留了数组。我让你看看std::reverse的工作原理。也不要使用using namespace std;。见why