这个题做了一会,发现怎么都显示段错误,就粘了一个Miller-Rabin
错误代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #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; } } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个适用于 .NET 的开源整洁架构项目模板
· API 风格选对了,文档写好了,项目就成功了一半!
· 【开源】C#上位机必备高效数据转换助手
· .NET 9.0 使用 Vulkan API 编写跨平台图形应用
· .NET 依赖注入中的 Captive Dependency