C++程序不完全执行迭代

C++程序不完全执行迭代,c++,C++,我写的程序应该接受两个用户输入,一个是我们用来检查它是否是k超完美的数字,另一个是最大k值。如果输入整数在1到输入的最大k值的范围内是k超完美的,那么输出应该是该k值。例如,如果输入整数为21,最大k值为100,则输出应为2 我的程序给出了正确的输出,第一个数字是输入整数,第二个数字是k-max值,第三个数字是输出值 21输入整数100 k-max->180 301 100 -> 6 12211188308281 100 -> 0 -301 100 -> 0 21 -5 -> 0 但是,对于

我写的程序应该接受两个用户输入,一个是我们用来检查它是否是k超完美的数字,另一个是最大k值。如果输入整数在1到输入的最大k值的范围内是k超完美的,那么输出应该是该k值。例如,如果输入整数为21,最大k值为100,则输出应为2

我的程序给出了正确的输出,第一个数字是输入整数,第二个数字是k-max值,第三个数字是输出值

21输入整数100 k-max->180 301 100 -> 6 12211188308281 100 -> 0 -301 100 -> 0 21 -5 -> 0 但是,对于12211188308281和200,它不能正确执行。当它应该给我180时,它给我0。我已经通过一个逐步可视化工具运行了我的代码,当else语句中for循环中的I=496时,它似乎突然停止了执行。但我不明白为什么,因为它在其他5次测试运行中正确执行

#include <iostream>
using std::cout; using std::cin; using std::endl; using std::fixed;


int main () { 
    int number; 
    int kmax; 
    int sum = 0 ; 
    int hyper = 0; 

    std::cin >> number; 
    std::cin >> kmax; 

    if (number <= 6 or kmax < 1) {
        std::cout << "0" << "\n"; 
    } 
    else { 
        for (int i=1;i<=number;i++) { 
            if (number%i==0 and i != 1 and i != number){ 
                    sum+= i; 
                }
            }
        }

    for (int k=1; k <= kmax; k++) { 
        hyper = ((sum)*k) + 1;
        if (hyper == number) { 
            std::cout << k << endl; 
            break; 
        } 
        } 

}

您为整数分配的值12211188308281太长,无法完全包含该值,并且该值将被截断为596285753。您可以添加打印语句来打印它

std::cout<<number; 
将打印596285753。
正如建议的那样,您应该使用long-long-int。这同样取决于系统上运行的软件平台

您需要检查通过std::IStream(如std::cin)读取的数字是否已成功读取。由于为数字输入的值太大,无法存储在整数中,因此读取将失败。例如,您可以将代码更改为:

int main()
{
    int number;     
    std::cin >> number; 
    if ( !std::cin )
    {
        std::cout << "invalid value: " << number << "\n";
        return 1;
    }
    else
    {
        std::cout << "valid value: " << number << "\n";        
    }
    // calculate answer
    return 0;
}
然后,您将看到您的程序打印无效值:2147483647(如果您有一个符合c++11的编译器),或一个未定义的数字(如果您有一个较旧的编译器)

现在您已经正确地实现了读取值,解决问题的方法是使用一个更大的整数类型,如int64,它可以保存您的数字。

如前所述,计算机中的int类型不够大,无法存储值12211188308281

< > C++标准只要求它能够存储一个值高达32767,即使在现在的32位int或long int的普通情况下,该限制也将是2147483647。因此,您需要一个long-long int或int64\t(如果它存在于您的实现中)

一张简单的支票

if (std::cin >> number >> kmax ) { // perform calculations...
会更早地显示错误的

Being说,为了提高效率,还可以对发布的代码进行一些简单的更改。考虑到给定数字的除数的对称性,可以优化第一个循环:也就是说,如果n可被a整除,那么b=n/a是一个整数,b也是n的除数。这将把迭代次数限制为n的平方根,而不是n

long long int number, 
              kmax, 
              sum = 0; 

 // ...

long long int temp = number,
              i = 2;
for (; i * i < number; i++) { 
    if (number % i == 0) {
        temp = number / i;
        sum += i + temp; 
    }
}
if (i * i == number) {
    sum += i;
}
可能有更好的算法,但我不熟悉

在我看来,第二个循环是不必要的。可直接计算k值:

if ( (number - 1) % sum == 0) {
    std::cout << (number - 1) / sum << '\n';
}

我已经通过一个分步可视化工具运行了我的代码,当I=496时,它似乎突然停止了执行。在这个阶段,您是否查看了局部变量的值,以给您一个提示,为什么它会突然停止?请注意,您的else{continue;}块完全不起作用。摆脱它好吧,首先,12211188308281不适合整数。试试long long。12211188308281可能太大,无法放入int,具体取决于计算机体系结构。试试看,你有没有检查数字的值?12211188308281比32位整数大得多。它不能完全包含它,并且正在被截断为596285753有符号整数溢出是未定义的行为。@AlgirdasPreidžius是的,我将提供的值赋给integer变量,发现它一直被截断为该值。请尝试它,但同意它可以不同的编译器。我不怀疑你得到这样的价值,通过运行你的机器上的代码。我刚才说,C++标准没有定义程序的行为,它包含有符号整数溢出。实际上SDT::CIN应该失败,并且应该将数值设置为STD::MultIcIQuix:::C++ 11之后的最大值,或者C++ 11之前的值将不被定义。