我试图弄清楚这个小代码有什么问题,它应该打印出所有的palindrome数字从1到100,000(我知道它很多数字)。我是新来的,我认为这可能是一个简单的修复,但我无法弄清楚,谢谢。
当我运行程序时,它只是给出:" 100000不是回文.............................................................................................................................................................................................................................................................................................."
(它应该打印数字,例如:111、121、131、141 .....直到100000)
#include<stdio.h>
#include<conio.h>
int main()
{
int n=0, reverse = 0, temp=0, i=0;
n=100000;
for(i=1; i<n; i++)
{
temp = i;
while( temp != 0 )
{
reverse = reverse * 10;
reverse = reverse + temp % 10;
temp = temp/10;
}
if( i == reverse )
printf("%d", n);
else
printf(".");
}
getch();
return 0;
}
您的代码中有2个明显的缺陷:
- 您在每次迭代之前都不会清除
reverse
,因此以前的迭代值正在累积和破坏算法。 - 在
printf
中,您应输出当前检查号码,而不是n
。
另一个现代C 时尚风格提示:
- 声明变量尽可能局部。您可以认真地在循环中声明它们!例如。
temp
和reverse
应在while
之前声明,i
应在for()
语句中声明。 -
使用
*=
,-=
,+=
代替=
:reverse *= 10; reverse += temp % 10; temp /= 10;
- 使用
std::cout
代替"旧好C"printf()
在调试中,第二次反转数字,并断言逆转两次将您带回相同的数字。
int reverse = doReverse( temp );
assert( temp == doReverse( reverse ));
您会发现自己的错误。
#include <iostream>
#include <algorithm>
#include <sstream>
using namespace std;
int main(int argc, char* argv[] )
{
string lStr;
for (int lIter = 1; lIter <= 100000; ++lIter ) {
stringstream lStrS;
lStrS << lIter;
lStr = lStrS.str();
string lRevStr = lStr;
reverse( lRevStr.begin(), lRevStr.end() );
if ( lRevStr == lStr ) {
cout << lStr << endl;
}
}
}
这是一种方法的示例。