2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。

现在,给定两个正整数 L 和 R (以字符串形式表示),

返回包含在范围 [L, R] 中的超级回文数的数目。

输入:L = "4", R = "1000"。

输出:4。

答案2023-06-12:

该算法的基本思路是从较小的回文数开始,一步步扩大得到超级回文数,检查是否在规定区间内,直到扩大的回文数超过给定区间右端点或者已经统计到所有的超级回文数。

大体步骤如下:

1.定义函数 superpalindromesInRange,输入两个正整数的字符串表示 leftright,返回包含在范围 [L, R] 中的超级回文数的数目。此函数的返回值为整数类型 int

2.将输入的字符串形式的正整数 leftright 分别转换成整数类型的变量 lr

3.将变量 r 开根号并取整,得到变量 limit。用变量 cnt 记录超级回文数的个数,初值为0。

4.变量 seed 初值为1,用于产生超级回文数。若当前 seed 对应的超级回文数已大于 r 的平方根,则跳出循环;否则进行下一步。

5.将变量 seed 进行第一次扩大,即将 seed 转化为一个更大的回文数,保存在变量 enlarge 中。

6.如果 enlarge 的平方数是超级回文数,则将 cnt 加一。

7.将变量 seed 进行第二次扩大,即将 seed 转化为一个更大的回文数,保存在变量 enlarge 中。

8.如果 enlarge 的平方数是超级回文数,则将 cnt 加一。

9.将 seed 加1。

10.回到步骤4,循环直到 seed 对应的扩大回文数大于 r 的平方根。

11.返回 cnt 作为函数的结果。

时间复杂度为 $O(\sqrt R\log R\log\log R)$,其中 $R$ 表示 right 的值,因为超级回文数的范围不超过 $\sqrt R$,而对于每一个超级回文数,需要判断其是否在 [L, R] 范围内,这个判断需要 $O(\log R)$ 的时间;同时,为了判断一个数是否是回文数,需要将其最高位和最低位一一比较,即需要 $O(\log n)$ 的时间,最多需要比较 $O(\log n)$ 次,因此判断回文数的时间复杂度为 $O(\log^2n)$。因此,总时间复杂度为 $O(\sqrt R\log R\log^2 R)$。

空间复杂度为 $O(1)$,因为程序只使用了常数个变量。

go语言完整代码如下:

package main

import (
"fmt"
"math"
"strconv"
) func superpalindromesInRange(left string, right string) int {
l, _ := strconv.ParseInt(left, 10, 64)
r, _ := strconv.ParseInt(right, 10, 64)
limit := int64(math.Sqrt(float64(r)))
cnt := 0
seed := int64(1)
enlarge := int64(0)
for {
enlarge = enlarge2(seed)
if isValid(enlarge*enlarge, l, r) {
cnt++
}
enlarge = enlarge1(seed)
if isValid(enlarge*enlarge, l, r) {
cnt++
}
seed++
if enlarge >= limit {
break
}
}
return cnt
} func enlarge1(seed int64) int64 {
var ans int64 = seed
seed /= 10
for seed != 0 {
ans = ans*10 + seed%10
seed /= 10
}
return ans
} func enlarge2(seed int64) int64 {
var ans int64 = seed
for seed != 0 {
ans = ans*10 + seed%10
seed /= 10
}
return ans
} func isValid(ans int64, l int64, r int64) bool {
return isPalindrome(ans) && ans >= l && ans <= r
} func isPalindrome(n int64) bool {
var help int64 = 1
for n/help >= 10 {
help *= 10
}
for n != 0 {
if n/help != n%10 {
return false
}
n = (n % help) / 10
help /= 100
}
return true
} func main() {
result := superpalindromesInRange("4", "1000")
fmt.Println(result)
}

rust完整代码如下:

fn superpalindromes_in_range(left: String, right: String) -> i32 {
let l: u64 = left.parse().unwrap();
let r: u64 = right.parse().unwrap();
let limit = (r as f64).sqrt() as u64;
let mut cnt = 0;
let mut seed = 1;
let mut enlarge = 0;
loop {
enlarge = enlarge2(seed);
if is_valid(enlarge * enlarge, l, r) {
cnt += 1;
}
enlarge = enlarge1(seed);
if is_valid(enlarge * enlarge, l, r) {
cnt += 1;
}
seed += 1;
if enlarge >= limit {
break;
}
}
cnt
} fn enlarge1(seed: u64) -> u64 {
let mut ans = seed;
let mut tmp = seed / 10;
while tmp != 0 {
ans = ans * 10 + tmp % 10;
tmp /= 10;
}
ans
} fn enlarge2(seed: u64) -> u64 {
let mut ans = seed;
let mut tmp = seed;
while tmp != 0 {
ans = ans * 10 + tmp % 10;
tmp /= 10;
}
ans
} fn is_palindrome(n: u64) -> bool {
let mut help: u64 = 1;
let mut tmp = n;
while tmp / help >= 10 {
help *= 10;
}
while tmp != 0 {
if tmp / help != tmp % 10 {
return false;
}
tmp = (tmp % help) / 10;
help /= 100;
}
true
} fn is_valid(ans: u64, l: u64, r: u64) -> bool {
is_palindrome(ans) && ans >= l && ans <= r
} fn main() {
let result = superpalindromes_in_range(String::from("4"), String::from("1000"));
println!("{}", result);
}

c++完整代码如下:

#include <iostream>
#include <string>
#include <cmath> using namespace std; long long enlarge1(long long seed);
long long enlarge2(long long seed);
bool isPalindrome(long long n);
bool isValid(long long ans, long long l, long long r);
int superpalindromesInRange(string left, string right); int main() {
int result = superpalindromesInRange("4", "1000");
cout << result << endl;
return 0;
} long long enlarge1(long long seed) {
long long ans = seed;
seed /= 10;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} long long enlarge2(long long seed) {
long long ans = seed;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} bool isPalindrome(long long n) {
long long help = 1;
while (n / help >= 10) {
help *= 10;
}
while (n != 0) {
if (n / help != n % 10) {
return false;
}
n = (n % help) / 10;
help /= 100;
}
return true;
} bool isValid(long long ans, long long l, long long r) {
return isPalindrome(ans) && ans >= l && ans <= r;
} int superpalindromesInRange(string left, string right) {
long long l = stoll(left);
long long r = stoll(right);
long long limit = sqrt(r);
int cnt = 0;
long long seed = 1;
long long enlarge = 0;
do {
enlarge = enlarge2(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
enlarge = enlarge1(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
seed++;
} while (enlarge <= limit);
return cnt;
}

c语言完整代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h> long long enlarge1(long long seed);
long long enlarge2(long long seed);
int isPalindrome(long long n);
int isValid(long long ans, long long l, long long r);
int superpalindromesInRange(char* left, char* right); int main() {
int result = superpalindromesInRange("4", "1000");
printf("%d\n", result);
return 0;
} long long enlarge1(long long seed) {
long long ans = seed;
seed /= 10;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} long long enlarge2(long long seed) {
long long ans = seed;
while (seed != 0) {
ans = ans * 10 + seed % 10;
seed /= 10;
}
return ans;
} int isPalindrome(long long n) {
long long help = 1;
while (n / help >= 10) {
help *= 10;
}
while (n != 0) {
if (n / help != n % 10) {
return 0;
}
n = (n % help) / 10;
help /= 100;
}
return 1;
} int isValid(long long ans, long long l, long long r) {
return isPalindrome(ans) && ans >= l && ans <= r;
} int superpalindromesInRange(char* left, char* right) {
long long l = atoll(left);
long long r = atoll(right);
long long limit = sqrt(r);
int cnt = 0;
long long seed = 1;
long long enlarge = 0;
do {
enlarge = enlarge2(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
enlarge = enlarge1(seed);
if (isValid(enlarge * enlarge, l, r)) {
cnt++;
}
seed++;
} while (enlarge <= limit);
return cnt;
}

2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 现在,给定两个正整数 L 和 R (以字符串形式表示), 返回包含在范围 [L, R] 中的更多相关文章

  1. 输入两个正整数m和n,求其最大公约数和最小公倍数

    public static void main(String[] args){  Scanner sc = new Scanner (System.in);  int a,b;  System.out ...

  2. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。

    给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...

  3. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  4. C语言实验报告(五) 两个正整数的最大公约数

    编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){  int n,a,b;  in ...

  5. SDUT 3503 有两个正整数,求N!的K进制的位数

    有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...

  6. 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5

    import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void ...

  7. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数

    课本例题 /*输入两个正整数num1.num2,计算并输出它们的和.差.积.整数商和余数.*/ #include<stdio.h> int main() { int num1, num2; ...

  8. 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。

    import java.util.Scanner;/*    给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000),    另一个是目标字符串TS(长度<1 ...

  9. Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】

    源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...

  10. 2019-6-27-WPF-如何给定两个点画出一条波浪线

    title author date CreateTime categories WPF 如何给定两个点画出一条波浪线 lindexi 2019-6-27 10:17:6 +0800 2019-6-26 ...

随机推荐

  1. 开发者需掌握的超实用VS Code for Windows快捷键

    链接|https://dev.to/devland/100-crucial-keyboard-shortcuts-for-vs-code-users-4474 作者|Thomas Sentre 翻译| ...

  2. TOP使用参数

    TOP使用参数top是检查机器当前运行状况的第一个命令,就好比是机器体检时的第一张报告单.先了解一下TOP命令的使用 [root@localhost /]# top -help top: procps ...

  3. 【SSM项目】尚筹网(五)项目改写:使用前后端分离的SpringSecurityJWT认证

    在项目中加入SpringSecurity 1 加入依赖 <!-- SpringSecurity --> <dependency> <groupId>org.spri ...

  4. odoo 开发入门教程系列-继承(Inheritance)

    继承(Inheritance) Odoo的一个强大方面是它的模块化.模块专用于业务需求,但模块也可以相互交互.这对于扩展现有模块的功能非常有用.例如,在我们的房地产场景中,我们希望在常规用户视图中直接 ...

  5. Java关键字以及标识符

    Java中有许多关键字,关键字是什么意思呢? 我用自己的分析来表达一下吧. Java就是源自于生活的,我们都有自己的名字.所以它也会有许多的名字,每个名字都有各自不同的特性(作用),都是系统定义好的. ...

  6. Spring的Factories机制介绍

    Java 的 SPI 机制 Java SpringBoot 加载 yml 配置文件中字典项 Spring的Factories就是Spring版本的Java Spi. Spring Factories的 ...

  7. Spring源码系列(补充):详解ApplicationContext

    前言 在之前的文章中,我们已经对Spring源码中的一些核心概念进行了分析.由于篇幅限制,我们并没有详细解释ApplicationContext类所继承的父接口及其作用.因此,本文将单独为Applic ...

  8. 【Visual Leak Detector】源码文件概览

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记.本篇对 VLD 源码包中的各文件用途做个概述.同系列文章目录可见 <内存泄漏检测工具>目录 目录 说明 1. 整体概览 2. ...

  9. 笔记五:进程间的通信(IPC通信之共享内存)

    IPC通信 IPC通信(Inter-Process Communication) 三种: 共享内存.消息队列.信号灯 这个IPC对象,肯定是存在于内核中.而且用户空间的文件系统中有没有IPC的文件类型 ...

  10. 如何通过C#/VB.NET 代码调整PDF文档的页边距

    PDF边距是页面主要内容区域和页面边缘之间的距离.与Word页边距不同,PDF文档的页边距很难更改.因为Adobe没有提供操作页边距的直接方法.但是,您可以通过缩放页面内容来改变页边距.本文将介绍如何 ...