2

第一次发帖!这是我学习“高级 C 和 C++”的第二个学期,因此非常感谢任何帮助。我已经搜索了尽可能多的 stackoverflow 和其他一些资源,试图帮助我理解我在使用这些逻辑上无能的代码做什么(或不做什么)。

该程序的目标是识别用户给出的“数字”是否是回文。听起来很简单吧?!呃......这就是我一直坚持的:

#include <iostream>

using std::cout;
using std::cin;

#include <string>

using std::string;

#include <cstdlib>

int main()
{

//variable declarations
string buffer;

//user input
cout << "Enter a number to see if it is a palindrome[Q to quit]: ";
getline(cin, buffer);

//looooop
while(buffer != "Q" && buffer !="q")
{
  int userNum, length, sum = 0, temp;
  userNum = atoi(buffer.c_str());
  for(temp = userNum; userNum !=0; userNum=userNum/10)
  {
    length = userNum % 10;
    sum = sum*10+length;
  }
  if(temp==sum)
    cout << temp << " is a palindrome!!\n\n";
  else
    cout << buffer << " is NOT a palindrome!\n\n";

  cout << "Enter a number to see if it is a palindrome[Q to quit]: ";
  getline(cin, buffer);
}
}

当输入“010”或“400”时出现问题。在这种情况下,“400”本质上是“00400”,两者都应该被视为回文。

4

2 回答 2

0

更好的方法是获取给定数字的尾随零,如下所示:

int noOfTrailingZeros = str.length;
while(str[--noOfTrailingZeros]=='0');
noOfTrailingZeros = str.length - noOfTrailingZeros;

或整数方式为:

int noOfTrailingZeros = str.length;
while(num%10==0)
{
    noOfTrailingZeros++;
    num/=10;
}

现在,检查输入字符串是否具有与数字相同的零个数:

int counterZeros = 0;
while(str[counterZeros++]=='0');

检查这两个数字,如果尾随零多于开头的零,则在开头添加那么多并将该字符串传递给回文函数。

于 2013-09-29T06:24:52.800 回答
0

首先,要识别回文,您不必这样做atoi。只需从开始到中间检查是否

buffer[i] == buffer[length - i]

其次,使用atoi确保它是一个数字并且你已经完成了。

另一种方法是将字符串与其自身进行比较:

string input;

cout << "Please enter a string: ";
cin >> input;

if (input == string(input.rbegin(), input.rend())) {
    cout << input << " is a palindrome";
}
于 2013-09-29T05:19:49.463 回答