[解题报告]《算法零基础100讲》(第7讲) 素数判定

一、回文素数

力扣:866.回文素数

题目描述

求出大于或等于 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;
        }
    }
};

二、丑数

力扣:剑指 Offer 49. 丑数

题目描述

我们把只包含质因子 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];
    }
};
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值