【发布时间】:2014-01-05 01:01:00
【问题描述】:
我写了下面的代码来判断一个数字是否是回文。但是当我编译并运行代码时,它会在代码块 10.05 和 12.11、13.12 中返回不同的结果。
我尝试了编号为 12321 的代码。代码块 10.05 返回“编号 12321 有 5 位,是一个回文数”。代码块 12.11 和 13.12 返回“数字 12321 有 5 位,不是回文数”。
这里是代码。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int num, tmp, tmp2, i, k, last_num=0, check_num;
cout<<"Enter a number : ";
cin>>num;
tmp=num;
check_num=num;
for(i=1; tmp>=10; ++i)
{
tmp=(tmp-(tmp%10))/10;
}
cout<<"The number "<<num<<" has "<<i<< " digits ";
for(k=i-1; k>=0; k--)
{
tmp2 = num%10;
last_num+=tmp2*pow(10,k);
num=(num-(num%10))/10;
}
if(check_num == last_num)
{
cout<<"and is a palindrome number"<<endl<<endl;
}
else
{
cout<<"and is NOT a palindrome number"<<endl<<endl;
}
return 0;
}
【问题讨论】:
-
闻起来像未定义的行为。不过,我没有看到您尝试在调试器中检查您的代码。此外,使用
pow()计算整数幂是错误的,因为该函数返回的值不准确。 -
嘿,新版本的 CodeBlocks。无论如何,这将是 GCC 4.4.1、GCC 4.7.(umm)1 的区别?以及新版本使用的任何内容,除非您更改了其中任何一个。
-
加上 H2CO3 所说的,你在某个时候计算出
pow(10,-1)。然后你将它乘以某个东西并将结果转换为一个 int。不同的编译器版本可能会发生不同的舍入。 -
@Floris 不,它很可能不会更快,而且肯定不会更干净。这是一个没有字符串的数学问题使用。我能想到的最佳解决方案是使用模运算 (
int k = 0; while (n) { k *= 10; k += n % 10; n /= 10; }) 以相反的顺序构建数字,然后检查新获得的数字是否与原始数字匹配。 -
@Floris 谢谢,很有趣。似乎除法(无论是正则还是模) 比从内存中读取要慢。我现在很着急,所以我没有时间检查组件,但我相信这可以解释它。另外,我很想知道如果转换以二进制、八进制或十六进制进行会有什么不同(只是为了使算术运算可以优化为按位运算)。虽然在您的特定实现上速度更快,但是使用字符串并没有成为“正确的解决方案 (TM)”——我们有一个数学问题的事实并没有改变。
标签: c++ codeblocks