目录
1、LeetCode——866. 回文素数
思路:从N开始往后判断每个数是不是素数,如果是素数就在判断是不是回文数,如果是就返回这个数。
1、判断素数:
- 1不是素数;(也不是合数)
- 除2以外的偶数都不是素数(因为能被2整除);
- 没有8位数的素数(10000000~99999999)
2、判断回文:
- 一位数的肯定是回文;
- 用一个数从N的最后一位开始倒着加,最后这个数和N相等的话,就是回文;
代码及详情:
#include<math.h>
//判断素数
bool isPrime(int n){
if(n <= 1) return false; //小于等于1的不是素数
if(n != 2 && n % 2 == 0) return false; //2是唯一偶素数
if(10000000 < n && n < 99999999) return false; //没有8位数的素数
int sqrtn = sqrt(n); //取平方根
for(int i = 2;i <= sqrtn;i++){ //遍历判断
if(n % i == 0)
return false;
}
return true;
}
//判断回文
bool isPalindrome(int n){
if(n / 10 == 0) return true; //一位数是回文数
int sum = 0;
int temp = n;
while(temp){
sum = sum * 10 + temp % 10; //这样是从n的末尾开始加起,如果是回文,那么sum应该等于n
temp /= 10;
}
return sum==n;
return true;
}
int primePalindrome(int n){
while(1){
if(isPrime(n)){ //判断是否素数
if(isPalindrome(n)){ //判断是否回文
return n;
}
}
++n;
}
return n;
}
2、LeetCode——剑指 Offer 49. 丑数
思路:使用暴力解法,挨个判断每个数的每个因子是否是除了2、3、5外的质数,如果是那这个数就不是丑数。但是暴力解法肯定会超出时间限制。
用三指针的方法:每个丑数都是由前面的最小的丑数乘 2、3、5 得来的
代码及详情:
int nthUglyNumber(int n){
int arr[n]; //定义一个数组存放丑数
arr[0] = 1; //第一个丑数是1
for(int i = 0,j = 0, k = 0,index = 1;index < n;index++){
//分别算出三个丑数,然后判断最小的,把最小的那个数加进数组并且指针加一
int x = arr[i] * 2;
int y = arr[j] * 3;
int z = arr[k] * 5;
int min = x > y ?(y > z ? z : y):(x > z ? z : x);
//指针加1
if(min == x) i++;
if(min == y) j++;
if(min == z) k++;
arr[index] = min;
}
return arr[n-1];
}