Я пытаюсь выяснить, что не так с этим маленьким кусочком кода, он должен печатать все числа палиндромов от 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
вместо «старого доброго С» 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;
}
}
}
Это пример одного из способов сделать это.