[解题报告]《算法零基础100讲》(第7讲) 素数判定
作者:互联网
文章目录
一、回文素数
题目描述
求出大于或等于 N 的最小回文素数。
回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。
例如,12321 是回文数。
思路分析
从n开始分别判断n是否是回文素数,同时注意不存在长度为8的素数,直接跳过即可。
具体代码
class Solution {
public:
int reverse(int n){
int ans=0;
while(n){
ans=ans*10+n%10;
n/=10;
}
return ans;
}
bool isPrime(int n){
if(n==1) return false;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return false;
}
}
return true;
}
int primePalindrome(int n) {
while(1){
if(n==reverse(n) && isPrime(n)){
return n;
}
n++;
if (10000000 < n && n < 100000000)
n = 100000000;
}
}
};
二、丑数
题目描述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
思路分析
丑数只包含质因子2、3、5,所以对于一个丑数来说,它一定是一个丑数乘以2或者3或者5.我们可以设置三个指针分别指向乘以2、3、5,我们取其中最小的数保存到对应的dp [i] 中,dp[i] 表示:第i个丑数。注意1是第一个丑数,我们从前循环遍历到n即可。
具体代码
class Solution {
public:
int dp[1692];
int nthUglyNumber(int n) {
dp[1]=1;
int p2=1,p3=1,p5=1;
for(int i=2;i<=n;i++){
dp[i]=min(dp[p2]*2,min(dp[p3]*3,dp[p5]*5));
if(dp[i]==dp[p2]*2){
p2++;
}
if(dp[i]==dp[p3]*3){
p3++;
}
if(dp[i]==dp[p5]*5){
p5++;
}
}
return dp[n];
}
};
标签:丑数,return,int,素数,解题,100,dp,回文 来源: https://blog.csdn.net/weixin_49393180/article/details/122157469