下面的代码有什么问题?

时间:2010-03-23 19:50:17

标签: c++ vector

#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
    int i, s, g;
    vector<int> a;
    cin >> s;
    for(i=1;i<=s;i++)
    {
        g = s;

        if(g<10) a.push_back(g);
        else {
            vector<int> temp;
            while(g > 0)
            {

                int k = g % 10;
                g = g / 10;
                temp.push_back(g);
            }
            for(int j=temp.size();j>0;j--)
            {
                a.push_back(temp[j]);
            }
        }
    }
    cout << a[s-1] << endl;
    return 0;
}

上面的代码有什么问题?它没有给我适当的结果。

矢量a应该保持从1,2,3 ......到s的值,使得a = 12345..910111213 ...并打印输出a [s]。如果s = 15 a = 123456789101112131415且a [15] = 2,则为Ex。

如果有人能告诉我这是什么问题

4 个答案:

答案 0 :(得分:3)

for(int j=temp.size();j>0;j--)
{
    a.push_back(temp[j]);
}

这里j的值包括temp.size和exclude 0.因为向量(基本上与其他所有带有整数索引的东西)都是0索引的,所以这将在第一次迭代时访问一个越界(即当你访问{{ 1}})。

答案 1 :(得分:2)

我认为您需要g = s;时有g = i;行。如上所述,对于s = 5,这将是你的向量a:5 5 5 5 5这根本不是你想要的。

[编辑]您对数字的处理&gt; 10也是关闭的。例如,您的代码目前在12号码中会发生什么?好吧,temp会1 0而不是1 2,然后会被推送到0 1,这也不是你想要的。

要解决这个问题,请考虑k应该做什么。

答案 2 :(得分:1)

更正代码:

int i, s, g;
vector<int> a;
cin >> s;
for(i=1;i<=s;i++)
{
    g = i; //Why was it s?

    if(g<10) a.push_back(g);
    else {
        vector<int> temp;
        while(g > 0)
        {

            int k = g % 10;
            g = g / 10;
            temp.push_back(k); //You need to push the remainder
        }
        for(int j=temp.size()-1;j>=0;j--) //Out of bounds error
        {
            a.push_back(temp[j]);
        }
    }
}
cout << a[s-1] << endl;

return 0;

a时,s = 15看起来像这样 - 这就是你要找的东西吗?

a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9
a[9] = 1
a[10] = 0
a[11] = 1
a[12] = 1
a[13] = 1
a[14] = 2
a[15] = 1
a[16] = 3
a[17] = 1
a[18] = 4
a[19] = 1
a[20] = 5

答案 3 :(得分:1)

我认为这里有一些问题。

首先,正如MBennett上面所说,你应该开始g = i;而不是g = s;

其次,我认为您的内部循环也有错误,您应该像现在一样推回k而不是g

第三,你应该像现在一样push_front()而不是push_back()。可以这样想,如果你只有那个循环,并且数字为162,如果你每次都按下BACK(不是前面),那么它会推动2,6,1,所以序列会有,而不是1 ,6,2,按你想要的顺序。在那之后你的副本似乎没问题,尽管有更有效的方法。

我认为就是这样。做这些改变它应该起作用,虽然我没有自己编译,我只是在脑海中解决。

相关问题