Переписал код с Python на c++, но где-то ошибся [закрыт]

142
04 декабря 2019, 21:20

код на python:

a = int(input())
q = 0
we = 0
j = 0
if len(str(a)) == 1:
    print(a)
else:
    for i in range(10,a):
        q = i
        we = i
        s = 0
        while len(str(q)) != 1:
            for e in range(len(str(q))):
                p = int(str(q)[e])
                we += p
                s += p
            q = s
            s = 0
        if we == a:
            print(i)
            j = 1
            break
    if j != 1:
        print(-1)

код на c++:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
    int a;
    int q;
    int we;
    int j;
    int s;
    int p;
    j = 0;
    string cv;
    string asdf;
    cin >> a;
    cv = to_string(a);
    if (cv.size() == 1)
    {
        cout << a;
    }
    else {
        for (int i = 10; i < (a + 1); i++) {
            q = i;
            we = i;
            s = 0;
            asdf = to_string(i);
            while (asdf.size() != 1)
            {
                for (int e = 0; e < asdf.size(); e++)
                {
                    p = asdf[e];
                    we += p;
                    s += p;
                }
                q = s;
                s = 0;
                asdf = to_string(q);
            }
            if (we == a)
            {
                cout << i;
                j = 1;
                break;
            }
        }
    }
    if (j != 1)
    {
        cout << "-1";
    }
    return 0;
}

Помогите найти ошибку, пожалуйста, во втором коде цикл становится бесконечным, f а такого быть не должно, как это исправить?

Answer 1

Ну, если вы так хотите перебором - т.е. пролететь по времени на реально больших тестах вас не пугает - то вот ваш код:

#include <iostream>
using namespace std;
unsigned int sum(unsigned int n)
{
    if (n < 10) return n;
    unsigned int m = 0, s = n;
    while(s)
    {
        m += s%10;
        s /= 10;
    }
    return n + sum(m);
}

int main(int argc, const char * argv[])
{
    unsigned int B;
    cin >> B;
    for(unsigned int a = 1; a <= B; ++a)
    {
        if (sum(a) == B)
        {
            cout << a << endl;
            return 0;
        }
    }
    cout << -1 << endl;
}

А вот если подумать о возможном диапазоне и изменить перебор - то вполне можно успеть, если заменить

for(unsigned int a = 1; a <= B; ++a)

на

for(unsigned int a = (B > 110) ? B-110 : 1 ; a <= B; ++a)
READ ALSO
Проблема с вводом из консоли

Проблема с вводом из консоли

Только учусь с++Написал простенькую программу, с циклом while

143
C++ cin.clear(); cin.ignore возвращают 0

C++ cin.clear(); cin.ignore возвращают 0

Доброй ночиВопрос от новичка

158
Права администратора в Qt

Права администратора в Qt

Есть приложение на Qt, и обычно располагается в Program FilesВ некоторых случаях, когда запускается программа, она запрашивает/не запрашивает права...

138