projecteuler.net译题

       5.1假期无聊,拿projecteuler练练手,我做的题在题库中算比较水的 ,希望大家不要笑话。。     
 projecteuler.net中的题基本都和数字相关,非常容易上手。现在找出几个有趣的题,分享一下。
1.

Problem 8</h2>
11 January 2002</div>

Find the greatest product of five consecutive digits in the 1000-digit number.</p> 73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

找出5个连续的数的最大乘积

我正在学C,这是代码。

#include

int main()
{
    char ch[1000]=
        "73167176531330624919225119674426574742355349194934"
        "96983520312774506326239578318016984801869478851843"
        "85861560789112949495459501737958331952853208805511"
        "12540698747158523863050715693290963295227443043557"
        "66896648950445244523161731856403098711121722383113"
        "62229893423380308135336276614282806444486645238749"
        "30358907296290491560440772390713810515859307960866"
        "70172427121883998797908792274921901699720888093776"
        "65727333001053367881220235421809751254540594752243"
        "52584907711670556013604839586446706324415722155397"
        "53697817977846174064955149290862569321978468622482"
        "83972241375657056057490261407972968652414535100474"
        "82166370484403199890008895243450658541227588666881"
        "16427171479924442928230863465674813919123162824586"
        "17866458359124566529476545682848912883142607690042"
        "24219022671055626321111109370544217506941658960408"
        "07198403850962455444362981230987879927244284909188"
        "84580156166097919133875499200524063689912560717606"
        "05886116467109405077541002256983155200055935729725"
        "71636269561882670428252483600823257530420752963450";
    int i,temp,product=7*3*1*6*7;
    for(i=0;i<996;i++)
    {
        temp=(ch[i]-'0')*(ch[i+1]-'0')*(ch[i+2]-'0')*(ch[i+3]-'0')*(ch[i+4]-'0');
        if(temp>product)
             product=temp;
    }
    printf("%dn",product);
    return 0;
    }

2.

Problem 11</h2>
22 February 2002</div>

In the 20×20 grid below, four numbers along a diagonal line have been marked in red.</p>

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26</b></span> 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63</b></span> 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78</b></span> 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14</b></span> 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
</p>

The product of these numbers is 26 × 63 × 78 × 14 = 1788696.</p>

What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the 20×20 grid?</p>

找出行列连续4个二位数的最大乘积,和problem8有相似的,但复杂一些。</p>

这个跑出的结果也通过了:</p>

#include

int main()
{
    int i,j,k,count,tmp1,tmp2,tmp3,tmp4,product=8*2*22*97;
    char a[20][40]={0};
    char ch[20][59]={
            "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08",
            "49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00",
            "81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65",
            "52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91",
            "22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80",
            "24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50",
            "32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70",
            "67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21",
            "24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72",
            "21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95",
            "78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92",
            "16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57",
            "86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58",
            "19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40",
            "04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66",
            "88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69",
            "04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36",
            "20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16",
            "20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54",
            "01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"};
    for(i=0;i<20;i++)
        for(j=0,count=0;j<59;j++)
            if(j%3==2)
                count++;
            else
                a[i][j-count]=ch[i][j];
    for(i=0;i<17;i++)
        for(j=0;j<40;j+=2)
        {
            for(k=3,tmp1=1;k>=0;k--)
                    tmp1*=(a[i+k][j]-'0')*10+a[i+k][j+1]-'0';
            if(tmp1>product)
                product=tmp1;
        }
    for(i=0;i<20;i++)
        for(j=0;j<33;j+=2)
        {
            for(k=3,tmp2=1;k>=0;k--)
                    tmp2*=(a[i][j+2*k]-'0')*10+a[i][j+2*k+1]-'0';
            if(tmp2>product)
                product=tmp2;
        }
    for(i=0;i<17;i++)
        for(j=0;j<33;j+=2)
        {
            for(k=3,tmp3=1;k>=0;k--)
                    tmp3*=(a[i+k][j+2*k]-'0')*10+a[i+k][j+2*k+1]-'0';
            if(tmp3>product)
                product=tmp3;
        }
    for(i=0;i<17;i++)
        for(j=6;j<40;j+=2)
        {
            for(k=3,tmp4=1;k>=0;k--)
                    tmp4*=(a[i+k][j-2*k]-'0')*10+a[i+k][j-2*k+1]-'0';
            if(tmp4>product)
                product=tmp4;
        }
    printf("the greatest num is %dn",product);
    return 0;
}</p>

3.
</p>

Problem 13
</h2>

The sequence of triangle numbers is generated by adding the natural numbers. So the 7th</sup> triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:</p>

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...</p>

Let us list the factors of the first seven triangle numbers:</p>

 1</b>: 1
 3</b>: 1,3
 6</b>: 1,2,3,6
10</b>: 1,2,5,10
15</b>: 1,3,5,15
21</b>: 1,3,7,21
28</b>: 1,2,4,7,14,28</blockquote>

We can see that 28 is the first triangle number to have over five divisors.</p>

What is the value of the first triangle number to have over five hundred divisors?</p>


</p>

第n个三角形数是前n个自然数的和,求有超过500个因子的最小三角形数:</p>

这个跑了2.3s左右,有更好的方法,欢迎paste上来。</p>

#include
#include


int main()
{
    long n,nth,i,j,count;
    for(n=7,nth=0;;n++)
    {
        j=sqrt(nth);
        nth=(n+1)*n/2;
        for(i=1,count=0;i<=j;i++)
            if(nth%i==0)
                count+=2;
        if(count>500)
            break;
    }
    printf("%ldn",nth);
    return 0;
}
</p>


</p>


</p>


</p> </div> </div></div>