判素数,参考:https://www.cnblogs.com/xiehongfeng100/p/4332998.html
按照定义 O(sqrt(n))
对于一个小于num的正整数x,如果num不能整除x,则num必然不能整除num/x (num = num/x * x)。反之相同。
我们又知num =√num*√num。 如果n除以大于√num的数,必得到小于√num的商,而小于√num的整数已经在2到√num的整数试过了,就没有必要再试(√num, num)范围内的数了。
for(int i=2;i*i<=n;i++)
筛法
筛法的思想是去除某个范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为合数。这个算法效率很高,但占用空间较大。
一个素数p只有1和p这两个约数,并且它的约数一定不大于其本身。因此,我们下边方法来筛选出来素数:
1)把从2开始的、某一范围内的正整数从小到大顺序排列;
2)剩下的数中选择最小的素数,然后去掉它的倍数。
3)依次类推,直到循环结束。
这种筛选法动态图如下:
筛法图解相关实现,见素数基本
题目链接
注意:<2的数均认为不是素数(测试点2)
#include <stdio.h>
#include <math.h>
int number,radix;
bool isPrime(int number){
if(number<2)
return false;
int bound=int(sqrt(number));
for (int i = 2; i <= bound; ++i) {
if(number%i==0)
return false;
}
return true;
}
int num_reverse_2_decimal(){
int digit[20],reverse_value=0;
int res=number,i;
for (i = 0;; ++i) {
digit[i]=res%radix;
res/=radix;
if(res==0)
break;
}
int base=1;
for(;i>=0;i--){
reverse_value+=base*digit[i];
base*=radix;
}
return reverse_value;
}
int main() {
while (scanf("%d",&number)!=EOF){
if(number<0)
break;
scanf("%d",&radix);
if(isPrime(number)&&isPrime(num_reverse_2_decimal()))
puts("Yes");
else
puts("No");
}
return 0;
}
网友评论