我正在学习自己的c++,我想:“我在哪里可以找到一些要解决的问题?” ...好吧,阅读stackoverflow时,我对euler项目很感兴趣,而我就在这里。

我正在做第四个问题(顺便问一句,不寻求帮助),但是我有一个非常奇怪的问题...

在这段代码中,我想用“数字”分隔一个数字...这样我可以说:如果数字的第一个数字等于最后一个数字,则它是回文数(可以从左到右读取的数字)或从右到左将是相同的数字...例如:90009)。

一切都很好,但是问题是当我尝试将数组元素划分为幂时...
例如:

90009 / power(10,4)= 9对吗? (当然使用整数)...
好吧,代码将9分配给arregloDeNumero [4],然后

arregloDeNumero [4] * pow(10,4)= 89999:O:O ??????????
它必须是90000对吗?

此外,如果您想运行此功能并在我的脑海中看到它的工作方式,我会放一些cout <
但是我的问题是:我写了一些不好的代码,还是某种错误或缺乏知识?

void verificarPalindromo(int x)
{

    int arregloDeNumero[6];
    int diferencia=0;

    for (int i=5;i>=0;i--){

        cout << "the number X is: " << x;
        cout << "and the difference is: " << diferencia << endl;

        arregloDeNumero[i]= ((x-diferencia)/pow(10,i));

        cout << "array of i= " << i << "is: " << arregloDeNumero[i];
        cout << " and the difference is: " << diferencia << endl;

        diferencia+=(arregloDeNumero[i]*pow(10,i));

        cout << "the new difference is: " << diferencia << endl;

    }

}

最佳答案

尽管您的代码不包含任何浮点数,但是pow()函数返回double,并且您对浮点数的理解似乎存在问题。通常情况下,除以浮点数可能会导致其值与实际结果略有不同(也许只有一位)。当此类值转换为整数时,它将被截断并导致下一个较低的整数。

你应该

a)使用完全使用整数实现的策略,或
b)使用浮点,但要确保对int的转换使用舍入而不是截断。

如果您具有足够高的警告级别,则编译器应告知您有关此潜在问题的信息。

明确地说,我认为问题出在这里:

((x-diferencia)/pow(10,i))

pow()对整数参数的结果将是一个整数值,但是由于类型为double,所以除法也是double。通常是浮点除法引起轻微错误的问题。以下更改可能会解决它。
((x-diferencia)/(int)pow(10,i))

09-28 10:13