2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。 现在,给定两个正整数 L 和 R (以字符串形式表示), 返回包含在范围 [L, R] 中
2023-06-12:如果一个正整数自身是回文数,而且它也是一个回文数的平方,那么我们称这个数为超级回文数。
现在,给定两个正整数 L 和 R (以字符串形式表示),
返回包含在范围 [L, R] 中的超级回文数的数目。
输入:L = "4", R = "1000"。
输出:4。
答案2023-06-12:
该算法的基本思路是从较小的回文数开始,一步步扩大得到超级回文数,检查是否在规定区间内,直到扩大的回文数超过给定区间右端点或者已经统计到所有的超级回文数。
大体步骤如下:
1.定义函数 superpalindromesInRange
,输入两个正整数的字符串表示 left
和 right
,返回包含在范围 [L, R]
中的超级回文数的数目。此函数的返回值为整数类型 int
。
2.将输入的字符串形式的正整数 left
和 right
分别转换成整数类型的变量 l
和 r
。
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] 中的更多相关文章
- 输入两个正整数m和n,求其最大公约数和最小公倍数
public static void main(String[] args){ Scanner sc = new Scanner (System.in); int a,b; System.out ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组
题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
- C语言实验报告(五) 两个正整数的最大公约数
编程实现求两个正整数的最大公约数,要求计算最大公约数用函数fun(int a,int b)实现. #include<stdio.h>void main(){ int n,a,b; in ...
- SDUT 3503 有两个正整数,求N!的K进制的位数
有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...
- 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5
import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数.15 20 5 public class Test { public static void ...
- 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
课本例题 /*输入两个正整数num1.num2,计算并输出它们的和.差.积.整数商和余数.*/ #include<stdio.h> int main() { int num1, num2; ...
- 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1000),请问能否通过删除SS中的字符(不改变顺序)将它变换成TS,如果可以输出“YES",不可以则输出“NO"。 输入说明:第一行为源字符串SS,第二行为目标字符串TS。
import java.util.Scanner;/* 给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串SS(长度<1000), 另一个是目标字符串TS(长度<1 ...
- Spring Security 5.0.x 参考手册 【翻译自官方GIT-2018.06.12】
源码请移步至:https://github.com/aquariuspj/spring-security/tree/translator/docs/manual/src/docs/asciidoc 版 ...
- 2019-6-27-WPF-如何给定两个点画出一条波浪线
title author date CreateTime categories WPF 如何给定两个点画出一条波浪线 lindexi 2019-6-27 10:17:6 +0800 2019-6-26 ...
随机推荐
- 计网学习笔记五 wireless && mobile networks
老师把无线网络用一节课一遍过了-感觉没能学透,便课后自己总结,看书,找资料补充,把无线网络大概摸了个七七八八.虽然不算精细,但还能看!内容包括WLAN总概,WiFi-WLAN的实现,802.11规定的 ...
- Rancher(V2.6.3)安装K8s教程
Rancher(V2.6.3)安装K8s教程 一,安装前环境准备: 1,升级Linux服务器内核 Ubuntu20.04: #查看当前内核版本 uname -rs #查看软件库中可下载的内核 sudo ...
- 股票K线图概要——R语言
K线图是200多年前日本人发明的,后来传入了美国.K线图本来就是对当前数据的可视化显示而已,但是越来越多的人对K线图做出了痴迷的分析和解读,有众多追随者也根据K线图指导自己的具体行动,因此,K线图在实 ...
- [Linux]ln:软链接与硬链接
1 硬链接与软链接的[语法] 软链接:ln -s 源文件 目标文件 硬链接:ln 源文件 目标文件 [-s : symbolic,符号/代号] 2 软链接/硬链接的[比喻] / (编辑)同步性 [ro ...
- [Java/IDE]IDEA运行Java类时报错:Error running 'MainTest': Command line is too long. Shorten command line for MainTest or also for Application default configuration
报错原因 Java项目启动命令过长 解决方法 点击项目启动配置项 -> shorten command line 选项选择 classpath file 或 java manifest 选项 - ...
- layUI之树状表格异步加载组件treetableAsync.js(基于treetable.js)
目录 概述 1. 使用说明 2. 使用需知 2.1 本组件依赖于treetable.js[重中之重] 2.2 本组件基于layUIAdmin进行使用 2.3 本组件的方法支持treetable.js的 ...
- 【Spring5】数据库事务操作
Spring针对事务的操作 事务的概念:事务是数据库最基本的单元,逻辑上的一组操作,要么都成功,如果有一个操作失败则都失败. 事务的特性:ACID 原子性.一致性.隔离性.持久性 JavaEE环境三层 ...
- [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范
漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...
- 微软出品的UI自动化测试工具Playwright(三)
微软出品的UI自动化测试工具Playwright(三) 网址 说明 https://playwright.dev/ 官网首页 https://playwright.dev/python/docs/in ...
- UniApp小程序开发如何获取用户手机号
我们在小程序开发的时候经常遇到这种需求,需要在账号登陆的时候进行手机号获取,并使用手机号登陆. 本文讲述如何在前后端分离的状态下获取手机号 查阅官网文档不难发现我们需要使用uni.login()这个方 ...