求n以内的最大素数,若n最大为21亿
2017-03-11 21:40
295 查看
网上搜了很久有几个特别好的没看懂
现在只能打出我能看懂的
主要思路就是:
1:若n不为素数,则在sqrt(n)内一定有一个n的因子
2:利用算法将2到sqrt(n)中的2,3,5的倍数去掉,减少了n/10*3的时间复杂度
现在只能打出我能看懂的
主要思路就是:
1:若n不为素数,则在sqrt(n)内一定有一个n的因子
2:利用算法将2到sqrt(n)中的2,3,5的倍数去掉,减少了n/10*3的时间复杂度
#include<stdio.h> #include <math.h> bool is_sushu(long long n); int main(){ long long n; bool flag ; while(true){ scanf("%I64d",&n); while(n--){ flag = is_sushu(n); if(flag == true) break; } printf("%I64d\n",n); } } bool is_sushu(long long n){ if(n==3||n==5||n==2) return true; if(n%2==0 || n%3==0 || n%5==0)//排除掉2,3,5的倍数 return false; long long c = 7; long long Cmax = (long long) sqrt(n);//如果n为素数则sqrt(n)内必定存在一个它的因子 while(c<Cmax)//通过下列的判断将2,3,5的倍数直接排除掉,减少循环的次数 { if(n%c==0) return false; c+=4;//第一次c为11 if(n%c==0) return false; c+=2;// 13 if(n%c==0) return false; c+=4;//17 if(n%c==0) return false; c+=2;//19 if(n%c==0) return false; c+=4;//23 if(n%c==0) return false; c+=6;//29 if(n%c==0) return false; c+=2;//31 if(n%c==0) return false; c+=6;//37 //下一个应该是41,又是+4, //下一个应该是43,又是+2 //……………………虽然不知道为什么会出现这种循环但事实就是这样 } return true; //据说这个的时间复杂度为o((sqrt(n)/10)*7) }
//下面的是我用普通的方式写的,发现几分钟都运行不出来 bool is_sushu(long long n){ long long i = 1; for(i =2;i<n;i++) { if(n%i==0) return false; } return true; }
相关文章推荐
- PTA教辅 求n以内最大的k个素数以及它们的和
- 5-36 求n以内最大的k个素数以及它们的和 (20分)
- 7-51 求n以内最大的k个素数以及它们的和
- 14 求n以内最大的k个素数以及它们的和
- PTA 7-14 求n以内最大的k个素数以及它们的和(20 分)
- 求n以内最大的k个素数以及它们的和
- 数学问题(六)之 求100以内最大的素数
- C语言:500 以内最大 10 个素数并求和
- pta 习题集 5-14 求n以内最大的k个素数以及它们的和
- 【ZOJ 1562和 BZOJ 1053】【反素数】【求n以内的因子最多的那个数(即不超过n的最大反素数)】
- pta 习题集 5-14 求n以内最大的k个素数以及它们的和
- Java中循环问题:for,while,do-while 各种练习(打印上三角、下三角、输出100以内的素数、水仙花、最大公约、最小公倍数、分解质因数、兔子问题)
- 2的256次方以内最大素数base58表示
- 利用素数表快速寻找 n 以内的所有素数
- js: 输出一个数以内的素数
- 第十二周上机任务项目-4输出10000以内的素数任务1
- 调用函数输出1000以内的回文素数。(第十二周上机任务).
- 1000以内素数
- nyoj 最大素因子 520 (反着素数打表)