请用C++完成编程如果一个正整数自身是回文数而且它也是一个回文数的平方那么我们称这个数为超级回文数。现在给定两个正整数 L 和 R 以字符串形式表示返回包含在范围 L R 中的超级回文数的数目。 示例:输入:L = 4 R = 1000输出:4解释:49121以及 484 是超级回文数。注意 676 不是一个超级回文数: 26 26 = 676但是 26 不是回文数。 提示:1 = lenL =
为了判断一个数是否是回文数,我们可以将这个数转为字符串,然后判断字符串是否是回文字符串。
接下来,我们需要生成所有的回文数。我们可以从1到10^5遍历,对于每个数,我们将它转为字符串并求平方,然后判断平方后的数是否是回文数,并且平方后的数不超过R。
最后,我们统计在范围[L, R]内的超级回文数的数量。
具体实现如下:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
bool isPalindrome(string s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}
int superpalindromesInRange(string L, string R) {
long long l = stoll(L);
long long r = stoll(R);
int count = 0;
// 生成回文数
for (int i = 1; i < 100000; i++) {
string s = to_string(i);
string rev = s;
reverse(rev.begin(), rev.end());
// 添加左半部分和右半部分
string num = s + rev;
long long val = stoll(num);
val *= val;
// 判断平方后的数是否是回文数,并且不超过R
if (val > r) {
break;
}
if (val >= l && isPalindrome(to_string(val))) {
count++;
}
// 添加中间部分
for (int j = 0; j < 10; j++) {
num[j] = s[j % s.length()];
val = stoll(num);
val *= val;
if (val > r) {
break;
}
if (val >= l && isPalindrome(to_string(val))) {
count++;
}
}
}
return count;
}
int main() {
string L = "4";
string R = "1000";
int count = superpalindromesInRange(L, R);
cout << count << endl;
return 0;
}
这里使用了stoll函数将字符串转为长整型数,使用了reverse函数将字符串进行反转。时间复杂度为O(10^5 * log(R)),空间复杂度为O(log(R))
原文地址: https://www.cveoy.top/t/topic/hK6N 著作权归作者所有。请勿转载和采集!