这个题做了一会,发现怎么都显示段错误,就粘了一个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;
        }
    }
    
}