- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40285
- 在线时间
- 小时
|
楼主 |
发表于 2008-6-25 22:21:47
|
显示全部楼层
Gxqcn帮忙看看,下面这个代码运行到一定时候就好像出错了-
- #define MAX_N 203280220
- unsigned int plist[MAX_N];
-
- int search_match_prime(unsigned value)
- {
- int start=0,mid,end=MAX_N-1;
- mid=(start+end)/2;
- while(end-start>=2){
- if(plist[mid]<value){
- start=mid;
- }else{
- end=mid;
- }
- mid=(start+end)/2;
- }
- return mid;
- }
-
- bool is_list(int num, unsigned long long sum)
- {
- unsigned long long aver=sum/num;
- if(aver>=0xFFFFFFFFLL)aver=0xFFFFFFFF;
- integer start(aver),end,sump(0);
- start.NextPrime(start);
- int prevc,nextc;
- prevc=num/2;
- nextc=num-1-prevc;
- int i;
- sump=end=start;
- for(i=0;i<nextc;i++){
- integer tmp(end);
- end.NextPrime(tmp);
- sump+=end;
- }
- for(i=0;i<prevc;i++){
- integer tmp(start);
- start.PreviousPrime(tmp);
- sump+=start;
- }
- if(sump<integer(sum)){
- while(sump<integer(sum)){
- integer newp;
- newp.NextPrime(end);
- sump+=newp-start;
- integer tmp(start);
- start.NextPrime(tmp);
- end=newp;
- }
- }else{
- while(sump>integer(sum)){
- integer newp;
- newp.PreviousPrime(start);
- sump-=end-newp;
- integer tmp(end);
- end.PreviousPrime(tmp);
- start=newp;
- }
- }
- return sump==integer(sum);
- }
-
- #define MF 2007
- #define MS 979
-
- void candidate(unsigned long long x, int mF,int mS)
- {
- integer y((unsigned long long)x);
- if(!y.IsPrime())
- return;
- printf("Cand%lld\n",x);
- if(!is_list(45,x))
- return;
- if(!is_list(17,x))
- return;
- if(!is_list(3,x))
- return;
- printf("%lld\n",x);
- }
- int main(int argc, char* argv[])
- {
- int i;
- long long max_sum=0;
- long long sumMF=0;
- long long sumMS=0;
- int count = HugeCalc::GetPrimeList(plist,MAX_N,3,0xFFFFFFFF);
- int iMS,iMF;
- if(count!=MAX_N){
- fprintf(stderr,"Invalid number of primes\n");
- }
- printf("Init finished\n");
- for(i=0;i<MS;i++){
- max_sum+=plist[MAX_N-1-i];
- }
- for(i=0;i<MS;i++){
- sumMS+=plist[i];
- }
- sumMF=sumMS;
- for(;i<MF;i++){
- sumMF+=plist[i];
- }
- iMF=0;iMS=0;
- while(sumMF<=max_sum&&iMF<MAX_N){
- while(sumMS<sumMF&&iMS<MAX_N){
- sumMS+=plist[iMS+MS]-plist[iMS];
- iMS++;
- }
- if(sumMS==sumMF){
- candidate(sumMF,iMF,iMS);
- }
- sumMF+=plist[iMF+MF]-plist[iMF];
- iMF++;
- }
- return 0;
- }
复制代码 |
|