#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。
如果有人能告诉我这是什么问题
答案 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,按你想要的顺序。在那之后你的副本似乎没问题,尽管有更有效的方法。
我认为就是这样。做这些改变它应该起作用,虽然我没有自己编译,我只是在脑海中解决。