C/C++经典程序训练6---歌德巴赫猜想的验证
这个题做了一会,发现怎么都显示段错误,就粘了一个Miller-Rabin
错误代码
#include#include #include #include #include using namespace std; const int MAXN=1000000; bool vis[MAXN]; int prime(int n){ vis[0]=vis[1]=1; for(int i=1;i<=n;i++){ if(vis[i])continue; for(int j=i;j<=n/i;j++){ vis[j*i]=1; } } } int gotbaha(int n){ prime(n); for(int i=1;i<=n;i++){ if((!vis[i])&&(!vis[n-i])){ printf("%d=%d+%d\n",n,i,n-i); return 0; } } }
C++代码(正解)
#include#include #include #include #include #include typedef long long ll; using namespace std; const int S=20; ll mod_mul(ll a,ll b,ll p){ ll res=0; a%=p,b%=p; while(b){ if(b&1)res=(res+a)%p; a=(a<<1)%p; b>>=1; } return res; } ll mod_pow(ll x,ll n,ll p){ ll res=1; while(n){ if(n&1)res=mod_mul(res,x,p); x=mod_mul(x,x,p); n>>=1; } return res; } bool check(ll a,ll n,ll x,ll t){//判断是否为合数 ll ret=mod_pow(a,x,n); ll last=ret; for(int i=1;i<=t;i++){ ret=mod_mul(ret,ret,n); if(ret==1&&last!=1&&last!=n-1)return 1; last=ret; } if(ret!=1) return 1;//fermat测试 return 0; } bool Miller_Rabin(ll n){ if(n<2)return 0; if(n==2)return 1; if((n&1)==0)return 0; ll x=n-1,t=0; while((x&1)==0)x>>=1,t++; for(int i=0;i ){ ll a=rand()%(n-1)+1; if(check(a,n,x,t))return 0;//合数 } return 1; } int prime(int n){ return 1; } int gotbaha(int n){ for(int i=1;i<=n;i++){ if((Miller_Rabin(i))&&(Miller_Rabin(n-i))){ printf("%d=%d+%d\n",n,i,n-i); return 0; } } }