使用函数(C++)验证字符串和整数是否为回文



我正在编写一个代码,它得到两个输入,一个是字符串,另一个是整数。它使用2个重载函数来打印每个输入的反面。我希望它做的是让代码验证每个输入,看看它是否是回文,但我似乎无法找到将反向变量作为单独变量并将其与用户输入进行比较的方法。

这是我的代码:

#include <iostream>
#include <ctime>
#include <time.h> 
using namespace std;
void reverse(string s);
void reverse(int x);

int main() {
string str;
int x;
cout<<"Enter a string: "<< endl;
cin>> str;
reverse(str);

cout<<"Enter an integer: "<< endl;
cin>> x;
reverse(x);
return 0;
}
void reverse(string s){
int x = s.length();
for (int i = 0; i < x / 2; i++){
swap(s[i], s[x - i - 1]);
}
cout<<s<< endl;

}
void reverse(int x){
int reversedNumber = 0, remainder;
while(x != 0) {
remainder = x%10;
reversedNumber = reversedNumber*10 + remainder;
x /= 10;
}
cout << reversedNumber;

}

您可以使用反向迭代器来帮助您完成此任务(std::string::rbegin返回一个指向字符串末尾的反向迭代程序(。std::to_string允许您将数字转换为字符串。没有必要编写自己的函数。这里有一个例子:

bool is_palindrome(const std::string &s)
{
return std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());
}
bool is_palindrome(const unsigned int i)
{
auto s = std::to_string(i);
return std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());
}
int main()
{
unsigned int number = 112343211;
std::string s = "abcdedcba";
std::cout << s << " is palindrome " 
<< std::boolalpha << is_palindrome(s) << "n";
std::cout << number << " is palindrome " 
<< std::boolalpha << is_palindrome(number) << "n";
}

请注意,为了简单起见,我使用了无符号整数。如果你想要有符号的int,你也必须注意这个符号。

演示。

您现有的函数打印它们的结果(通过流式传输到std::cout(。要做任何更有用的事情,您需要返回值。

例如:

std::string reverse(std::string s)
{
auto x = s.length();
for (std::size_t i = 0;  i < x / 2;  ++i) {
swap(s[i], s[x - i - 1]);
}
// Return the value for caller to use
return s;
}

或者更简洁地说:

std::string reverse(const std::string& s)
{
return {s.rbegin(), s.rend()};
}

然后您的main()可以使用等测试

if (str == reverse(str))

通过反转输入的后半部分并将其与输入的前半部分进行检查,将速度提高一倍。

然后决定逐个字符的检查是否比使用";反向";作用

也许是这样的(请原谅任何语法错误(:

int len = s.length()
int mid = len / 2;
for (int i = 0; i < mid; i++){
if (s[i] != s[x - len - 1]) {
return false;
}
}
return true;

然后考虑使用指针,这可能实现得更好:

int len = s.length()
int mid = len / 2;
char *a = &s;
char *z = &s[len - 1];
for (int i = 0; i < mid; i++){
if (*a++ != *z--) {
return false;
}
}
return true;

(有没有一种"重复N次?"的结构可以消除对显式i的需要。(

或者你可以说while (a < z):

while (a++ < z--) {
if (*a != *z) {
return false;
}
}
return true;

最新更新