C 中的所有回文数量从1到100,000

  • 本文关键字:回文 c++ palindrome
  • 更新时间 :
  • 英文 :


我试图弄清楚这个小代码有什么问题,它应该打印出所有的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个明显的缺陷:

  1. 您在每次迭代之前都不会清除reverse,因此以前的迭代值正在累积和破坏算法。
  2. printf中,您应输出当前检查号码,而不是n

另一个现代C 时尚风格提示:

  1. 声明变量尽可能局部。您可以认真地在循环中声明它们!例如。tempreverse应在while之前声明,i应在for()语句中声明。
  2. 使用*=-=+=代替=

    reverse *= 10;
    reverse += temp % 10;
    temp /= 10;
    
  3. 使用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;
    }
 }

}

这是一种方法的示例。

最新更新