欧拉计划16-20题
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; }
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; }
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 4
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:
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; }
Answer:1074
Completed on Thu, 1 May 2014, 16:31
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; }
Answer:171
Completed on Mon, 18 Nov 2013, 03:38
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; }