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),请执行以下操作:
助手(z*W+x*w,m+2*i,M,lb,ub)
W:=10^(m+2*i-1)
w:=10^i
对于初始化z:=1,当z<=9时,更新(将z增加1),执行-
从主要方法中,执行以下操作-
lb:=L的平方根,ub:=R的平方根
M:=执行ubbase10+1的日志
对于初始化z:=0,当z<=9时,更新(将z增加1),执行-
助手(z,1,M,lb,ub)
助手(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