В чем проблема с кодом ниже? - PullRequest
1 голос
/ 23 марта 2010
#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.

Если бы кто-то мог сказать мне, в чем проблема

Ответы [ 4 ]

3 голосов
/ 23 марта 2010
for(int j=temp.size();j>0;j--)
{
    a.push_back(temp[j]);
}

Здесь значения j включают temp.size и исключают 0. Поскольку векторы (как и в основном все остальное с целочисленными индексами) индексируются 0, это даст доступ к выходу за пределы на первой итерации (т. Е. При доступе к temp[temp.size()]).

2 голосов
/ 23 марта 2010

У вас есть строка g = s;, когда я думаю, что вы хотите g = i;. Как написано, для s = 5 это будет ваш вектор a: 5 5 5 5 5 Что совсем не то, что вы хотите.

[Редактировать] Ваша обработка чисел> 10 также отключена. Например, что происходит в вашем коде в настоящее время для числа 12? Ну, temp будет 1 0 вместо 1 2, а затем это будет помещено в 0 1, что опять не то, что вы хотите.

Чтобы это исправить, подумайте о том, что должен делать k.

1 голос
/ 23 марта 2010

Я думаю, здесь есть несколько проблем.

Во-первых, как сказал выше MBennett, вы должны были начать с g = i;, а не g = s;.

Во-вторых, я думаю, что ваш внутренний цикл также имеет ошибку, из-за которой вы должны отталкиваться k, а не g, как сейчас.

В-третьих, вы должны делать push_front(), а не push_back(), как сейчас. Подумайте об этом таким образом, если у вас был только этот цикл, и у вас было число 162. Если вы каждый раз нажимаете НАЗАД (не вперед), то это подталкивает 2, 6, 1, и последовательность будет иметь это, а не 1 6, 2, в том порядке, который вы хотите. Ваша копия после этого выглядит нормально, хотя есть более эффективные способы сделать это.

Я думаю, вот и все. Внесите эти изменения, и он должен работать, хотя я сам не скомпилировал его, я просто решаю в своей голове.

1 голос
/ 23 марта 2010

Исправленный код:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...