【问题标题】:C++: variable "long long" goes crazy when growing in loopC ++:变量“long long”在循环中增长时变得疯狂
【发布时间】:2016-02-22 08:16:26
【问题描述】:

我用 C++ 编写了一个简单的程序来练习,因为我正在学习 C++,所以他的程序输入例如 123 的数字,然后将该数字反转为 321 并将其添加到其原始数字,而不是反转该数字再次检查它是否与未反转的相同,如果不同,则重复该过程,直到反转的数字与非反转的数字相同。

我的问题: 我设置了 long long 变量,因为在此计算中可能会出现大数字,我的问题是当数字进入循环(loop2)时,它似乎已达到最大值,或者您可以在屏幕截图中看到结果。

注意:第一个 while 循环不打算重复,我在其中放置了代码,以便如果您输入的数字已经满足要求,我可以跳过该代码。

注意 2:我用 Python 编写的这个程序完全一样,它运行良好,如果有帮助,我也可以提供源代码。

注意 3:不要介意字符串中的文本,它是我的语言。

注意4:在示例中,我从输入的数字 196121 中截取了屏幕截图,这应该通过 4 个步骤解决,我用我用 python 编写的相同程序对其进行了测试。

/* while(number!=0){
reverse = reverse * 10;
reverse = reverse + number%10;
number = number/10;
}
*/

#include <iostream>
using namespace std;

int main()
{
    int count = 1;
    int loop1 = 1;
    int loop2 = 1;
    long long num = 0ll;
    long long rev = 0ll;
    long long tmp = 0ll;
    long long tmp_ = 0ll;
    long long var_ = 0ll;
    long long zasprovj = 0ll;
    long long number = 0ll;

    cout << "UKOLIKO SE UNESE BROJ KOJI NIJE MOGUĆE IZRAČUNATI PROGRAM CE OSTATI    U BESKONACNOJ PETLJI KAO STO JE NPR. BROJ 196 !"<<endl;
    cout << endl;
    cout << endl;
    cout << endl;

    cout << "MOLIMO UNESITE BROJ: ";
    cin >> num;
    cout << endl;
    number = num;

    while (number != 0)
    {
        zasprovj = zasprovj * 10;
        zasprovj = zasprovj + number % 10;
        number = number / 10;
    }

    if (num == zasprovj)
    {
        cout << "Operacija izvrsena, rezultat:  " << zasprovj << "  Koraka = 0";
        loop1 = 0;
        loop2 = 0;
    }

    while (loop1 == 1)
    {
        number = num;
        while (number != 0)
        {
            rev = rev * 10;
            rev = rev + number % 10;
            number = number / 10;
        }
        cout << "okrenuti uneseni broj je: " << rev << endl;
        tmp = rev + num;
        cout << "rev + n = "<<tmp<<endl;
        number = tmp;
        while (number != 0)
        {
            tmp_ = tmp_ * 10;
            tmp_ = tmp_ + number % 10;
            number = number / 10;
        }
        cout << "okrenuti tmp = " << tmp_ << endl;

        if(tmp == tmp_)
        {
            cout << "Izracun je: " << tmp << "<-- u koraka: " << count << endl;
            loop2 = 0;
            loop1 = 0;
        }
        cout << ">>>>>>> "<<count<<". STEP <<<<<<"<<endl;
        loop1 = 0;
    }

    while (loop2 == 1)
    {
        count = count + 1;
        cout << ">>>>>>> " << count << ". STEP <<<<<<" << endl;

        number = tmp_;
        while(number!=0)
        {
            rev = rev * 10;
            rev = rev + number%10;
            number = number/10;
        }
        tmp = rev + tmp_;
        cout << "rev + tmp_ = "<<tmp<<endl;

        number = tmp;
        while (number != 0)
        {
            tmp_ = tmp_ * 10;
            tmp_ = tmp_ + number%10;
            number = number / 10;
        }
        cout << "reversed tmp(tmp = rev + tmp_) = " << tmp_<<endl;

        if (tmp == tmp_)
        {
            cout << "Izracun je: "<<tmp<<"<-- u koraka: " <<count<<endl;
            loop2 = 0;
        }
    }
    cout << endl;
    cout << endl;
    cout << "CTRL + C  za izlaz";
    cin >> rev;
}

【问题讨论】:

  • 请提供重现问题的minimal reproducible example。有这么大的代码墙,再加上一半的变量(更不用说 cmets)不是英文的,很难理解代码的实际作用。

标签: c++ c++11


【解决方案1】:

您忘记在计算反向之前重新初始化rev。所以旧的rev 会添加到新的倒序号码之前。

只需在number = tmp_;的同时添加rev = 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多