C++ C+中从1到100000的所有回文数+;
我试图找出这段代码的错误,它应该打印从1到100000的所有回文数字(我知道它有很多数字)。我是新来的,我想这可能是一个简单的解决办法,但我想不出来,谢谢 当我运行程序时,它只给出:“100000不是回文” (它应该打印数字,比如:111、121、131、141……直到100000)C++ C+中从1到100000的所有回文数+;,c++,palindrome,C++,Palindrome,我试图找出这段代码的错误,它应该打印从1到100000的所有回文数字(我知道它有很多数字)。我是新来的,我想这可能是一个简单的解决办法,但我想不出来,谢谢 当我运行程序时,它只给出:“100000不是回文” (它应该打印数字,比如:111、121、131、141……直到100000) #包括 #包括 int main() { int n=0,reverse=0,temp=0,i=0; n=100000; 对于debug中的(i=1;i),再次反转数字,并断言反转两次会使您回到相同的数字 int
#包括
#包括
int main()
{
int n=0,reverse=0,temp=0,i=0;
n=100000;
对于debug中的(i=1;i),再次反转数字,并断言反转两次会使您回到相同的数字
int reverse = doReverse( temp );
assert( temp == doReverse( reverse ));
您将发现错误。您的代码中有两个明显的缺陷:
在每次迭代之前,您没有清除reverse
,因此先前迭代的值正在累积并破坏算法
在printf
中,您应输出当前检查的编号,而不是n
另一个现代C++流行风格提示:
尽可能在本地声明变量。您可以在循环内声明变量,认真地说!例如,temp
和reverse
应在之前声明,而i
应在for()
语句内声明
使用*=
,-=
,+=
代替=
:
reverse *= 10;
reverse += temp % 10;
temp /= 10;
使用std::cout
而不是“old good C”printf()
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
字符串lStr;
对于(int-l=1;l这将是一个尝试在调试器中单步执行代码以查看实际情况的好时机(提示:代码中至少有一个相当明显的错误-如果您还看不到它,那么当您进入while循环时,它应该很明显)。启动调试器,放置一些断点,然后进行研究!您可能必须使用字符串来正确转换数字:1)在尽可能小的范围内声明变量,以及2)这两个很好的示例对变量进行描述性的命名,如代码> Max No./COD>,而不是<代码> N>代码>。可能是纯代码> C++ >代码>变量声明、类型、函数,包括->代码> C/<代码>。@ LoL4T0 OP标记了C++。除“代码> STD::CUT/<代码>之外的大多数提示对于现代<代码> C <代码>都是有效的。此答案中的建议。将反转功能分离为其自身的功能,并执行测试以确保其工作。但有一个警告:如果将以零结尾的数字反转两次,它将不会返回原始数字。因此测试方法应跳过这些。
reverse *= 10;
reverse += temp % 10;
temp /= 10;
#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;
}
}