我正在学习自己的c ++,我想:“我在哪里可以找到一些需要解决的问题?”......好吧,在stackoverflow中阅读我对euler项目感兴趣,而且我在这里。
我正在做第四个问题(不是求助BTW),但我有一个非常奇怪的问题......
在这段代码中,我想用“数字”分隔一个数字......我可以说:如果数字的第一个数字等于最后一个数字,那么它就是一个回文数字(可以读取的数字)从左到右或从右到左,将是相同的数字...例如:90009)。
一切都很好,但问题是当我尝试将数组元素划分为幂时...... 例如:
90009 / power(10,4)= 9对吗? (当然使用整数)...... 好吧,代码将9分配给arregloDeNumero [4],然后
arregloDeNumero [4] * pow(10,4)= 89999:O:O ??????????? 它必须是90000对吗?
另外,我把一些cout<<代码,如果你想运行这个函数,看看它是如何工作的:P
但我的问题是:我是否写了一些不好的代码,或者是某种错误或缺乏知识?
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;
}
}
答案 0 :(得分:1)
虽然您的代码不包含任何浮点数,但pow()
函数返回double
,并且您对浮点数的理解似乎存在问题。通常情况下,划分浮点数可能会导致与精确结果略有不同(可能只有一位)的值。当这样的值转换为整数时,它会被截断并产生下一个较低的整数。
你应该
a)使用完全使用整数实现的策略,或 b)使用浮点,但确保转换为int使用舍入而不是截断。
如果你有足够高的警告级别,编译器应该告诉你这个潜在的问题。
为了清楚起见,我认为问题出现在这里:
((x-diferencia)/pow(10,i))
整数参数的pow()结果将是一个整数值,但因为类型是double,所以除法也是double。这是浮点除法(通常)导致轻微错误的问题。以下更改可能会解决此问题。
((x-diferencia)/(int)pow(10,i))