-1

我试图弄清楚这段代码有什么问题,它应该打印从 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;
}
4

3 回答 3

2

您的代码中有 2 个明显的缺陷:

  1. 您在每次迭代之前都没有清除reverse,因此先前迭代的值正在累积和破坏算法。
  2. printf你应该输出当前检查的数字,而不是n

另一种现代 C++ 时尚风格暗示:

  1. 尽可能在本地声明变量。你可以在循环中声明它们,说真的!例如temp,andreverse应在 之前声明whilei应在语句内部for()声明。
  2. 使用*=, -=,+=代替=:

    reverse *= 10;
    reverse += temp % 10;
    temp /= 10;
    
  3. 使用std::cout而不是“老好 C”printf()
于 2012-10-23T16:53:59.583 回答
0

在调试中,再次反转数字并断言反转两次会使您回到相同的数字。

int reverse = doReverse( temp );
assert( temp == doReverse( reverse ));

你会发现你的错误。

于 2012-10-23T16:44:41.440 回答
0
#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;
    }
 }

}

这是一种方法的示例。

于 2012-10-23T18:08:40.843 回答