素数测试应用
来源:互联网 发布:mac safari视频插件 编辑:程序博客网 时间:2024/05/17 01:12
例题一:分拆素数和(hdu 2098)
把一个偶数拆成两个不同素数之和,有多少种拆法
输入:包含一个正整数,其值不会超过10 000,输入0结束
输出:输出拆成的不同素数对的个数
#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define N 20000bool isprime[N];///判定i是否为素数int n;void init(){ memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(int i=2;i<N;i++) { if(isprime[i]) { for(int j=i*i;j<N;j+=i) isprime[j]=0; } }}int main(){ init(); while(scanf("%d",&n)!=EOF) { if(n==0) break; int num=0; for(int i=2;i<=n/2+1;i++) { if(isprime[i]&&isprime[n-i]) { if(i!=n-i)///要求两个素数不相同 num++; } } cout<<num<<endl; } return 0;}
例题二 云之遥—素数(nefu 109)
判定一个数是否为素数
输入:数据有多组,每组输入一个N,且N是大于0且小于2 000 000 000 的整数
#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;#define N 50000///根号下20亿bool isprime[N];int prime[N],nprime;void doprime(){ long long i,j;///? nprime=0; memset(isprime,1,sizeof(isprime)); isprime[1]=0; for(i=2;i<N;i++) { if(isprime[i]) { nprime++; prime[nprime]=i; for(j=i*i;j<N;j+=i) isprime[j]=0; } } }bool isp(long long n)///基本法求素数{ int i; int k=(int)sqrt(double(n)); for(i=1;prime[i]<=k;i++)///这里是小于等于 if(n%prime[i]==0) return 0; return 1;}int main(){ doprime(); long long n; while(scanf("%lld",&n)!=EOF) { if(n==1) cout<<"NO"<<endl; else { if(isp(n)) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
例题三 素数距离(pku 2689)
题意:求给定区间内的质数距离最小的一对和质数距离最大的一对。
输入:两个正整数L和U,L<U,L和U相差不超过1 000 000
输出:输出两对相邻素数
分析:使用筛选法筛掉[L,U]内的所有非素数,需要知道[L,U]区间的所有非素数的素数因子,21亿内的数或者是素数,或者能被根号21亿内的素数整除,也就是说[L,U]区间内的所有非素数的素因子都在根号21亿内
预先将根号21亿内的所有素数找出来,然后用这些素数去筛掉指定区间的所有非素数
根据素数分布定律,100 000个数中最多有80 000(n/ln(n))个素数
#include<cstdio>#include<iostream>#include<cstring>using namespace std;#define N 50000#define maxint 0x3f3f3flong long l,u;long long prime2[1000005];///存储区间[l,u]内的素数int prime1[N];///存储根号21亿内的素数int nprime1,nprime2;///记录所存素数的个数bool isprime[N];///判定是否为素数void doprime(){ long long i,j; nprime1=0; memset(isprime,1,sizeof(isprime)); for(i=2;i<N;i++) { if(isprime[i]) { nprime1++; prime1[nprime1]=i; for(j=i*i;j<N;j+=i) isprime[j]=0; } }}void judge(){ long long i,j,b; memset(isprime,1,sizeof(isprime)); for(i=1;i<=nprime1;i++) { b=l/prime1[i]; while(b*prime1[i]<l||b<=1)///从第一个大于等于l的数开始筛选 b++; for(j=b*prime1[i];j<=u;j+=prime1[i]) { if(j>=l) isprime[j-l]=0; } } if(l==1)///考录到l==1的情况 isprime[0]=0;}void solve(){ int i; long long min=maxint; long long max=-maxint; long long minl,minr,maxl,maxr; judge(); nprime2=0; for(i=0;i<=u-l;i++)///记录区间[l,u]中素数的个数,并将素数顺序存储起来 { if(isprime[i]) { nprime2++; prime2[nprime2]=i+l; } } if(nprime2<=1) printf("There are no adjacent primes.\n"); else { for(i=2;i<=nprime2;i++) { int temp=prime2[i]-prime2[i-1];///记录相邻素数的距离 if(temp<min) { min=temp; minl=prime2[i-1]; minr=prime2[i]; } if(temp>max) { max=temp; maxl=prime2[i-1]; maxr=prime2[i]; } } printf("%lld,%lld are closest,%lld,%lld are most distant.\n",minl,minr,maxl,maxr); }}int main(){ doprime(); while(scanf("%lld%lld",&l,&u)!=EOF) { solve(); } return 0;}
0 0
- 素数测试应用
- POJ3641 Pseudoprime numbers 素数测试的应用
- 素数测试
- 素数测试
- 素数测试
- 素数测试
- 素数测试
- 素数测试
- 素数测试
- Miller_Rabin素数测试
- 随机算法 素数测试
- 素数与素性测试
- Miller - Rabin素数测试
- 大素数测试
- 素数的Miller_Rabbin测试
- 素数判定--米勒测试
- 大素数“测试”
- Miller-Rabin素数测试
- Spring使用注解注入接口实现类
- POJ 3660 Cow Contest(Floyd最短路)
- [Leetcode] Flatten Binary Tree to Linked List
- 从零单排RxAndroid系列-----定时器
- 每天晚上回家要做的事情
- 素数测试应用
- C++类中的静态成员变量和静态成员函数的作用
- 118. Pascal's Triangle
- 笔记
- tdint.h跨平台整数,float类型的机器码(阶码)
- C语言大小端判定
- 笔记
- Ajax 简单的实例代码
- 【九度OJ】题目1172:哈夫曼树 解题报告