【问题标题】:Recognize "010" and similar numbers as a palindrome using modulus in C++在 C++ 中使用模数将“010”和类似数字识别为回文
【发布时间】:2013-09-29 05:16:00
【问题描述】:

第一次发帖!这是我学习“高级 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”,两者都应该被视为回文。

【问题讨论】:

  • 您为什么不将其作为stringchar 数组呢?这样会更通用,并且会起作用。正如您所指出的,00400 等同于 400,因此您可以永远确定它是/不是回文。如果你想确定它是一个数字,那么做一个检查,但保持一个字符串表示,并使用一个循环遍历字符串的整数一半(奇数长度,中间字符无关)进行比较,比较相反的字符方式。
  • "010" 不是数字。这是一个字符序列。对于这个问题,这是一件好事。数字不能是回文,尽管它们的文本表示可以。
  • 教授还没有“教”我们使用数组,所以全班必须找到一种替代方法来处理它。

标签: c++ palindrome


【解决方案1】:

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

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');

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

【讨论】:

  • 我可能会实施这种策略,除了尝试分离用户输入的每一部分。仍在工作中,但我很喜欢这个建议!
【解决方案2】:

首先,要识别回文,您不必执行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";
}

【讨论】:

  • 这是在正确的轨道上,但没有解决他问题最后一句话中“作为一个数字”的需求。
  • 您不需要为此构造第二个字符串。 std::mismatch (input.begin(), input.end(), input.rbegin(), input.rend()) 将返回一个 std::pair,其中包含发生不匹配的迭代器。如果它们是input.end()input.rend(),则字符串是回文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
相关资源
最近更新 更多