欧拉计划16-20题

16、Power digit sum

215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.

What is the sum of the digits of the number 21000?

题目大意:

215 = 32768 并且其各位之和为 is 3 + 2 + 7 + 6 + 8 = 26.

21000 的各位数之和是多少?

#include <stdio.h> 

#include <stdbool.h>



void solve(void)

{

    int a[100000] = {0};

    int n, sum, i, j;

    n = sum = 0;

    a[0] = 1;

    for(i = 0; i < 1000; i++) {  //以1000进制的方法存储

        for(j = 0; j <= n; j++) {

            a[j] *= 2;

        }

        for(j = 0; j <= n; j++) {

            if(a[j] >= 10000) {

                a[j] %= 10000;

                a[j+1]++;

                n++;

            }

        }

    }

    for(i = 0; i <= n; i++) {

        sum += a[i] / 10000;

        a[i] %= 10000;

        sum += a[i] / 1000;

        a[i] %= 1000;

        sum += a[i] / 100;

        a[i] %= 100;

        sum += a[i] / 10;

        a[i] %= 10;

        sum += a[i];



    }

    printf("%d\n",sum);

}



int main(void)

{

    solve();

    return 0;

}
View Code
Answer:1366C
ompleted on Sun, 17 Nov 2013, 15:23

17、Number letter counts

If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.

If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?

NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.

题目大意:

如果用英文写出数字1到5: one, two, three, four, five, 那么一共需要3 + 3 + 5 + 4 + 4 = 19个字母。

如果数字1到1000(包含1000)用英文写出,那么一共需要多少个字母?

注意: 空格和连字符不算在内。例如,342 (three hundred and forty-two)包含23个字母; 115 (one hundred and fifteen)包含20个字母。"and" 的使用与英国标准一致。

#include <stdio.h> 

#include <stdbool.h>



int a[101] = {0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8};



void init(void)  //初始化数组

{

    a[20] = 6;

    a[30] = 6;

    a[40] = 5;

    a[50] = 5;

    a[60] = 5;

    a[70] = 7;

    a[80] = 6;

    a[90] = 6;

    a[100] = 7;

}



int within100(void)  //计算1~99所含字母的和

{

    int i, sum, t;

    t = sum = 0;

    for(i = 1; i <= 9; i++) t += a[i];

    for(i = 1; i <= 19; i++) sum += a[i];

    for(i = 2; i <= 9; i++) {

        sum += a[i*10] * 10;

        sum += t;

    }

    return sum;

}



void solve(void)

{

    int i;

    int sum, t;

    sum = t = within100();

    for(i = 1; i < 10; i++) {

        sum += (a[i] + 10) * 99 + (a[i] + 7) + t;

    }

    sum += 11;



    printf("%d\n",sum);

}



int main(void)

{

    init();

    solve();

    return 0;

}
View Code
Answer:21124
Completed on Sun, 17 Nov 2013, 16:30

18、Maximum path sum I

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.

    3

  7   

 2  4  6

8  5  9  3

That is, 3 + 7 + 4 + 9 = 23.

Find the maximum total from top to bottom of the triangle below:

欧拉计划16-20题

NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)

题目大意:

找出从以下三角形的顶端走到底端的最大总和:

#include<stdio.h>



#define N 15

int main()

{

    char t[5];

    int s[N][N]={0};

    FILE *f;

    int i,j;

    f = fopen("18.txt","r");

    for (i = 0; i < N; i++) {

        for (j = 0; j <= i; j++) {

            fgets(t,4,f);

            s[i][j] =atoi(t);

        }

    }

    fclose(f);

    for ( i = N-2; i >=0; i--) {

          for ( j = 0; j <= i; j++) {

               if (s[i+1][j] > s[i+1][j+1]) {

                s[i][j]+=s[i+1][j];

            } else {

                s[i][j]+=s[i+1][j+1];

            }

        }

    }

    printf("answer: %d\n",s[0][0]);

    return 0;

}
View Code

Answer:1074

Completed on Thu, 1 May 2014, 16:31


19、Counting Sundays

You are given the following information, but you may prefer to do some research for yourself.

  • 1 Jan 1900 was a Monday.
  • Thirty days has September, April, June and November. All the rest have thirty-one, Saving February alone, Which has twenty-eight, rain or shine. And on leap years, twenty-nine.
  • A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

题目大意:

以下是一些已知信息,但是或许你需要自己做一些其他的调查。

  • 1900年1月1日是星期一。
  • 30天的月份有:9月,4月,6月,11月。
  • 此外的月份都是31天,当然2月除外。
  • 2月在闰年有29天,其他时候有28天。
  • 年份可以被4整除的时候是闰年,但是不能被400整除的世纪年(100的整数倍年)除外。

20世纪(1901年1月1日到2000年12月31日)一共有多少个星期日落在了当月的第一天?

#include <stdio.h> 

#include <stdbool.h>



const int a[2][12] = {{31,28,31,30,31,30,31,31,30,31,30,31},

                     {31,29,31,30,31,30,31,31,30,31,30,31}};





bool leapYear(int n)  //判断闰年

{

    return (((n % 4 ==0) && (n % 100 !=0)) || (n % 400 == 0));

}



bool issunday(int n) //判断某天是否是星期天

{

    return (n % 7 == 0 ? true : false);

}



void solve(void)

{

    int num, i, j, count;

    count = 0;



    i = 1901;

    num = 1;

    while(i < 2000) {



        int t = (leapYear(i) ? 1 : 0);   //判断闰年

        for(j = 0; j < 12; j++) {

            num += a[t][j];

            if(issunday(num)) count++;

        }

        i++;

    }

    printf("%d\n",count);

}



int main(void)

{

    solve();

    return 0;

}
View Code

Answer:171

Completed on Mon, 18 Nov 2013, 03:38


20、Factorial digit sum

n! means n  (n  1)  ...  3  2  1

For example, 10! = 10  9  ...  3  2  1 = 3628800, and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Find the sum of the digits in the number 100!

题目大意:

n! = n  (n  1)  ...  3  2  1

例如, 10! = 10  9  ...  3  2  1 = 3628800, 那么10!的各位之和就是3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

算出100!的各位之和。

#include <stdio.h>

#include <math.h>



#define N 100



int main(void){

    int n=N*log(N/3),a[n],ca=0,i,j;

    for(i = 0; i < n; i++)

        a[i] = 0;

    a[n-1] = 1;

    for(i = 1; i <= N; i++){

        for(j = n - 1; j >= 0; j--){

            ca = i * a[j] + ca;

            a[j] = ca % 10;

            ca /= 10;

        }

        ca = 0;

    }

    ca = 0;

    for(i = 0; i < n; i++)

        ca += a[i];

    printf("%d\n",ca);

    return 0;

}
View Code
Answer:648
Completed on Sun, 13 Apr 2014, 02:47

 

你可能感兴趣的:(欧拉计划)