力扣: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]; } };