Project Euler:problem 108
2017-07-04 12:45 mo_0820 阅读(199) 评论(0) 收藏 举报题目链接:http://pe-cn.github.io/108/
# include <stdio.h> # include <math.h> int prime(int i) { int j; if(i<=1) return 0; for(j=2;j<sqrt(i);j++) if(i%j==0) break; if(j>sqrt(i)) return 1; else return 0; } int main() { int NN=1000; int i,j,k,m,PR[20],n,N[20],NR[20],x,y,flag=1; double r=1.0,min; for(i=2,n=0;n<20;i++) { if(prime(i)==1) { PR[n]=i; n+=1; } } n=(int)(log(2*NN)/log(3))+1; for(i=0;i<=n;i++) N[i]=1; for(i=0;i<=n;i++) printf("%2d ",PR[i]); printf("\n"); for(i=0;i<=n;i++) printf("%2d ",N[i]); printf("\n"); for(i=n,flag=1;i>=0;i--) { //printf("%d\n",i); if(flag==1) { for(j=0;j<=i;j++) NR[j]=N[j]; for(j=i-1;j>0;j--) if(N[j]!=N[j-1]) break; printf("%2d %2d\n",i,j); m=j; } else { for(j=0;j<=i;j++) N[j]=NR[j]; for(j=m-1;j>0;j--) if(N[j]!=N[j-1]) break; printf("%2d %2d\n",i,j); m=j; flag=1; } x=(int)pow(PR[i],N[i]); for(;;) { if(x>=PR[j]) { N[j]+=1; for(k=0,y=1;k<i;k++) { y*=(2*N[k]+1); //printf("%d ",N[k]); } //printf("%d\n",y); if(y+1>2*NN) break; x/=PR[j]; j+=1; if(j==i) { for(j=j-1;j>0;j--) if(N[j]!=N[j-1]) break; } } else { break; } } for(j=0,x=1;j<i;j++) { x*=(2*N[j]+1); printf("%2d ",N[j]); } printf("%d\n",x); if(x+1<2*NN) { if(m==0) break; flag=0; i+=1; } } for(j=0,r=1.0;j<=i;j++) r*=pow(PR[j],NR[j]); printf("%f\n",r); return 0; }
运行结果:
2 3 5 7 11 13 17 19
1 1 1 1 1 1 1 1
7 0
2 1 1 1 1 1 1 3645
6 1
2 2 1 1 1 1 2025
5 2
2 2 2 1 1 1125
5 0
3 3 1 1 1 1323
180180.000000
Press any key to continue
浙公网安备 33010602011771号