给定两个正整数L和R(表示为字符串),其中 。任务是找到包含范围[L,R]的超级回文总数。
如果回文既是回文又是回文的平方,则称为超级回文。
例子:
Input: L = "4", R = "1000"
Output: 4
Explanation: 4, 9, 121, and 484 are super-palindromes.
Input : L = "100000", R = "10000000000"
Output : 11
方法:
可以说是一种超级回文。
现在,因为R是回文,的R的数字的第一半可以被用于确定R将一直到两种可能性。让我成为R中数字的前半部分。例如。如果i = 123 ,则R = 12321或R = 123321 。因此,我们可以遍历所有这些数字。同样,每个可能性在R中可以具有奇数或偶数个数字。
因此,我们遍历每个i直到10 5并创建关联的回文数R ,并检查R 2是否为回文数。
同样,我们将分别处理奇数和偶数回文,并且只要回文超过R就会中断。
现在,因为 , 和和 (在串联上),其中i ‘是i的倒数(双向),因此我们的LIMIT不会大于 。
下面是上述方法的实现:
C++
// C++ implementation of the
// above approach
#include
using namespace std;
// check if a number is a palindrome
bool ispalindrome(int x)
{
int ans = 0;
int temp = x;
while (temp > 0)
{
ans = 10 * ans + temp % 10;
temp = temp / 10;
}
return ans == x;
}
// Function to return required count
// of palindromes
int SuperPalindromes(int L, int R)
{
// Range [L, R]
// Upper limit
int LIMIT = 100000;
int ans = 0;
// count odd length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
string s = to_string(i); // if s = '1234'
string rs = s.substr(0, s.size() - 1);
reverse(rs.begin(), rs.end());
// then, t = '1234321'
string p = s + rs;
int p_sq = pow(stoi(p), 2);
if (p_sq > R)
break;
if (p_sq >= L and ispalindrome(p_sq))
ans = ans + 1;
}
// count even length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
string s = to_string(i); // if s = '1234'
string rs = s;
reverse(rs.begin(), rs.end());
string p = s + rs; // then, t = '12344321'
int p_sq = pow(stoi(p), 2);
if (p_sq > R)
break;
if (p_sq >= L and ispalindrome(p_sq))
ans = ans + 1;
}
// Return count of super-palindromes
return ans;
}
// Driver Code
int main()
{
string L = "4";
string R = "1000";
// function call to get required answer
printf("%d\n", SuperPalindromes(stoi(L),
stoi(R)));
return 0;
}
// This code is contributed
// by Harshit Saini
Java
// Java implementation of the
// above approach
import java.lang.*;
class GFG
{
// check if a number is a palindrome
public static boolean ispalindrome(int x)
{
int ans = 0;
int temp = x;
while (temp > 0)
{
ans = 10 * ans + temp % 10;
temp = temp / 10;
}
return ans == x;
}
// Function to return required
// count of palindromes
public static int SuperPalindromes(int L,
int R)
{
// Range [L, R]
// Upper limit
int LIMIT = 100000;
int ans = 0;
// count odd length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
// if s = '1234'
String s = Integer.toString(i);
StringBuilder rs = new StringBuilder();
rs.append(s.substring(0,
Math.max(1, s.length() - 1)));
String srs = rs.reverse().toString();
// then, t = '1234321'
String p = s + srs;
int p_sq = (int)(Math.pow(
Integer.parseInt(p), 2));
if (p_sq > R)
{
break;
}
if (p_sq >= L && ispalindrome(p_sq))
{
ans = ans + 1;
}
}
// count even length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
// if s = '1234'
String s = Integer.toString(i);
StringBuilder rs = new StringBuilder();
rs.append(s);
rs = rs.reverse();
String p = s + rs; // then, t = '12344321'
int p_sq = (int)(Math.pow(
Integer.parseInt(p), 2));
if (p_sq > R)
{
break;
}
if (p_sq >= L && ispalindrome(p_sq))
{
ans = ans + 1;
}
}
// Return count of super-palindromes
return ans;
}
// Driver program
public static void main(String [] args)
{
String L = "4";
String R = "1000";
// function call to get required answer
System.out.println(SuperPalindromes(
Integer.parseInt(L), Integer.parseInt(R)));
}
}
// This code is contributed
// by Harshit Saini
Python3
# Python implementation of the above approach
# check if a number is a palindrome
def ispalindrome(x):
ans, temp = 0, x
while temp > 0:
ans = 10 * ans + temp % 10
temp = temp // 10
return ans == x
# Function to return required count of palindromes
def SuperPalindromes(L, R):
# Range [L, R]
L, R = int(L), int(R)
# Upper limit
LIMIT = 100000
ans = 0
# count odd length palindromes
for i in range(LIMIT):
s = str(i) # if s = '1234'
p = s + s[-2::-1] # then, t = '1234321'
p_sq = int(p) ** 2
if p_sq > R:
break
if p_sq >= L and ispalindrome(p_sq):
ans = ans + 1
# count even length palindromes
for i in range(LIMIT):
s = str(i) # if s = '1234'
p = s + s[::-1] # then, t = '12344321'
p_sq = int(p) ** 2
if p_sq > R:
break
if p_sq >= L and ispalindrome(p_sq):
ans = ans + 1
# Return count of super-palindromes
return ans
# Driver program
L = "4"
R = "1000"
# function call to get required answer
print(SuperPalindromes(L, R))
# This code is written by
# Sanjit_Prasad
C#
// C# implementation of the
// above approach
using System;
class GFG
{
// check if a number is a palindrome
static bool ispalindrome(int x)
{
int ans = 0;
int temp = x;
while (temp > 0)
{
ans = 10 * ans + temp % 10;
temp = temp / 10;
}
return ans == x;
}
// utility function used for
// reversing a string
static string Reverse( string s )
{
char[] charArray = s.ToCharArray();
Array.Reverse( charArray );
return new string( charArray );
}
// Function to return required
// count of palindromes
static int SuperPalindromes(int L, int R)
{
// Range [L, R]
// Upper limit
int LIMIT = 100000;
int ans = 0;
// count odd length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
// if s = '1234'
string s = i.ToString();
string rs = s.Substring(0,
Math.Max(1, s.Length - 1));
rs = Reverse(rs);
// then, t = '1234321'
string p = s + rs;
int p_sq = (int)(Math.Pow(
Int32.Parse(p), 2));
if (p_sq > R)
{
break;
}
if (p_sq >= L && ispalindrome(p_sq))
{
ans = ans + 1;
}
}
// count even length palindromes
for (int i = 0 ;i < LIMIT; i++)
{
// if s = '1234'
string s = i.ToString();
string rs = Reverse(s);
string p = s + rs; // then, t = '12344321'
int p_sq = (int)(Math.Pow(
Int32.Parse(p), 2));
if (p_sq > R)
{
break;
}
if (p_sq >= L && ispalindrome(p_sq))
{
ans = ans + 1;
}
}
// Return count of super-palindromes
return ans;
}
// Driver Code
public static void Main()
{
string L = "4";
String R = "1000";
// function call to get required answer
Console.WriteLine(SuperPalindromes(
Int32.Parse(L), Int32.Parse(R)));
}
}
// This code is contributed
// by Harshit Saini
PHP
0)
{
$ans = (10 * $ans) +
($temp % 10);
$temp = (int)($temp / 10);
}
return $ans == $x;
}
// Function to return required
// count of palindromes
function SuperPalindromes($L, $R)
{
// Range [L, R]
$L = (int)$L;
$R = (int)$R;
// Upper limit
$LIMIT = 100000;
$ans = 0;
// count odd length palindromes
for($i = 0 ;$i < $LIMIT; $i++)
{
$s = (string)$i; // if s = '1234'
$rs = substr($s, 0, strlen($s) - 1);
$p = $s.strrev($rs); // then, t = '1234321'
$p_sq = (int)$p ** 2;
if ($p_sq > $R)
{
break;
}
if ($p_sq >= $L and ispalindrome($p_sq))
{
$ans = $ans + 1;
}
}
// count even length palindromes
for($i = 0 ;$i < $LIMIT; $i++)
{
$s = (string)$i; // if s = '1234'
$p = $s.strrev($s); // then, t = '12344321'
$p_sq = (int)$p ** 2;
if ($p_sq > $R)
{
break;
}
if ($p_sq >= $L and ispalindrome($p_sq))
{
$ans = $ans + 1;
}
}
// Return count of super-palindromes
return $ans;
}
// Driver Code
$L = "4";
$R = "1000";
// function call to get required answer
echo SuperPalindromes($L, $R);
// This code is contributed
// by Harshit Saini
?>
输出:
4
时间复杂度: O(N * log(N)),其中N为上限,log(N)项来自检查候选人是否为回文症。