代码改变世界

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

Email: mo_0820@sina.com