-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は の直前whileに宣言されなければならず、ステートメントi内で宣言されなければなりません。for()
  2. の代わりに*=、、-=を使用します。+==

    reverse *= 10;
    reverse += temp % 10;
    temp /= 10;
    
  3. std::cout「古き良きC」の代わりに使うprintf()
于 2012-10-23T16:53:59.583 に答える
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;
    }
 }

}

これは、その方法の 1 つの例です。

于 2012-10-23T18:08:40.843 に答える