
这个题做了一会,发现怎么都显示段错误,就粘了一个Miller-Rabin
错误代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
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<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> 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<S;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; } } }
 
                    
                