C++中的超级回文数
假设我们有一个正整数N,如果它是一个回文数,并且也是一个回文数的平方,则称它为超级回文数。现在考虑我们有两个正整数L和R,我们需要找到[L, R]区间内超级回文数的数量。
因此,如果输入像L = 5,R = 500,则输出为3,超级回文数为9、121、484。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数helper(),它将接收x、m、M、lb、ub作为参数。
如果x > ub,则:
返回
如果x >= lb并且(x * x)是回文数,则:
(将ans增加1)
从i := 1开始初始化,当m + 2 * i <= M时,更新(i增加1),执行:
W := 10^(m + 2 * i - 1)
w := 10^i
从z := 1开始初始化,当z <= 9时,更新(z增加1),执行:
helper(z * W + x * w, m + 2 * i, M, lb, ub)
在主方法中,执行以下操作:
lb := L的平方根,ub := R的平方根
M := 执行ub以10为底的对数 + 1
从z := 0开始初始化,当z <= 9时,更新(z增加1),执行:
helper(z, 1, M, lb, ub)
helper(11 * z, 2, M, lb, ub)
返回ans
让我们看看下面的实现,以便更好地理解:
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
int ans = 0;
public:
int superpalindromesInRange(string L, string R){
long double lb = sqrtl(stol(L)), ub = sqrtl(stol(R));
int M = log10l(ub) + 1;
for (int z = 0; z <= 9; z++) {
helper(z, 1, M, lb, ub);
helper(11 * z, 2, M, lb, ub);
}
return ans;
}
private:
void helper(long x, int m, int M, long double lb, long double ub){
if (x > ub)
return;
if (x >= lb && is_palindrome(x * x))
ans++;
for (int i = 1; m + 2 * i <= M; i++) {
long W = powl(10, m + 2 * i - 1) + 1;
long w = powl(10, i);
for (int z = 1; z <= 9; z++)
helper(z * W + x * w, m + 2 * i, M, lb, ub);
}
}
bool is_palindrome(long x){
if (x == 0)
return true;
if (x % 10 == 0)
return false;
long left = x, right = 0;
while (left >= right) {
if (left == right || left / 10 == right)
return true;
right = 10 * right + (left % 10), left /= 10;
}
return false;
}
};
main(){
Solution ob;
cout << (ob.superpalindromesInRange("5", "500"));
}输入
"5", "500"
输出
3
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP