我们在第一年编程中使用C ++的任务之一是编写一个函数,可以检查数字是否是回文符号(例如16461)。我上传了我的代码但是我甚至不知道从整数中提取数字或检查整数中的位数时从哪里开始。任何帮助或提示将不胜感激!
答案 0 :(得分:2)
有很多方法可以解决这个问题。我最喜欢构建镜像编号并检查它是否与原始版本相同的解决方案(即使它可能不是最有效的方式)。代码应该是这样的:
bool isPalindrom(int n) {
int original = n;
int mirror = 0;
while (n) {
mirror = mirror * 10 + n % 10;
n /= 10;
}
return mirror == original;
}
答案 1 :(得分:0)
您可以使用模运算(%运算符)来提取单个数字。另一种方法是获取数字的字符串表示并使用它。
答案 2 :(得分:0)
提示:
123 = 1*100 + 2*10 + 3*1
)相关联,因此要提取数字,您需要提取10的幂。关键操作是余数和截断除法。如果你(123 % 10)
会怎么样? (123 / 10)
怎么样? ((123 / 10) % 10)
怎么样?答案 3 :(得分:0)
最好先将整数转换为字符串。如果它是一个回文测试字符串要容易得多。
#include <sstream>
#include <iostream>
#include <string>
bool isPalindrome(int value)
{
// convert integer into text
std::ostringstream oss;
oss << value;
std::string valueText = oss.str();
if (valueText.size()%2==0) {
return false;
}
for (int i = 0; i < (valueText.size()/2); ++i) {
if (valueText[i]!=valueText[valueText.size()-i-1]) {
return false;
}
}
return true;
}
int main()
{
for (int i = 0; i < 100000; ++i) {
if (isPalindrome(i)) {
std::cout << i << std::endl;
}
}
return 0;
}
首先将整数转换为std::string
:
std::ostringstream oss;
oss << value;
std::string valueText = oss.str();
现在检查字符串是否有奇数位数:
if (valueText.size()%2==0) {
return false;
}
如果字符串具有奇数位数,请测试数字是否匹配:
for (int i = 0; i < (valueText.size()/2); ++i) {
if (valueText[i]!=valueText[valueText.size()-i-1]) {
return false;
}
}
答案 4 :(得分:0)
这是一个将整数转换为C风格字符串并从那里开始的解决方案。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
bool isPalindrome(int n) {
char s[256];
sprintf(s, "%d", n);
char *p = s, *q = &s[strlen(s) - 1];
while (*p == *q && p++ < q--)
;
return (p == q) || (*p == *q);
}
int main() {
int n = 1644451;
cout << isPalindrome(n) << endl;
return 0;
}
答案 5 :(得分:0)
如果性能不是问题,并且你可以做c ++ 11,这是一个易于阅读的解决方案:
template<class T>
bool isPalindrome(T i)
{
auto s = std::to_string(i);
auto s2 = s;
std::reverse(s.begin(), s.end());
return s == s2;
}
当然比手动浏览数字慢得多,但imho非常易读......
用它来表示:
std::cout << isPalindrome<int>(12321);
std::cout << isPalindrome<int>(1232);