标签:
昨天,类型安全的心园友发表了一篇随笔“[Project Euler]加入欧拉 Problem 13 被卡住了,调试不出正确结果囧”。这道题目是要求计算出下面的100个50位数字的和的前十位数字:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
37107287533902102798797998220837590246510135740250463769376774900097126481248969700780504170182605387432498619952474105947423330951305812372661730962991942213363574161572522430563301811072406154908250230675882075393461711719803104210475137780632466768926167069662363382013637841838368417873436172675728112879812849979408065481931592621691275889832738442742289174325203219235894228767964876702721893184745144573600130643909116721685684458871160315327670386486105843025439939619828917593665686757934951621764571418565606295021572231965867550793241933316490635246274190492910143244581382266334794475817892575867718337217661963751590579239728245598838407582035653253593990084026335689488301894586282278288018119938482628201427819413994056758715117009439035398664372827112653829987240784473053190104293586865155060062958648615320752733719591914205172558297169388870771546649911559348760353292171497005693854370070576826684624621495650076471787294438377604532826541087568284431911906346940378552177792951453612327252500029607107508256381565671088525835072145876576172410976447339110607218265236877223636045174237069058518606604482076212098132878607339694128114266041808683061932846081119106155694051268969251934325451728388641918047049293215058642563049483624672216484350762017279180399446930047329563406911573244438690812579451408905770622942919710792820955037687525678773091862540744969844508330393682126183363848253301546861961243487676812975343759465158038628759287849020152168555482871720121925776695478182833757993103614740356856449095527097864797581167263201004368978425535399209318374414978068609844840309812907779179908821879532736447567559084803087086987551392711854517078544161852424320693150332599594068957565367821070749269665376763262354472106979395067965269474259770973916669376304263398708541052684708299085211399427365734116182760315001271653786073615010808570091499395125570281987460043753582903531743471732693212357815498262974255273730794953759765105305946966067683156574377167401875275889028025717332296191766687138199318110487701902712526768027607800301367868099252546340106163286652636270218540497705585629946580636237993140746255962240744869082311749777923654662572469233228109171419143028819710328859780666976089293863828502533340334413065578016127815921815005561868836468420090470230530811728164304876237919698424872550366387845831148769693215490281042402013833512446218144177347063783299490636259666498587618221225225512486764533677201869716985443124195724099139590089523100588229554825530026352078153229679624948164195386821877476085327132285723110424803456124867697064507995236377742425354112916842768655389262050249103265729672370191327572567528565324825826546309220705859652229798860272258331913126375147341994889534765745501184957014548792889848568277260777137214037988797153829820378303147352772158034814451349137322665138134829543829199918180278916522431027392251122869539409579530664052326325380441000596549391598795936352974615218550237130764225512118369380358038858490341698116222072977186158236678424689157993532961922624679571944012690438771072750481023908955235974572318970677254791506150550495392297953090112996751986188088225875314529584099251203829009407770775672113067397083047244838165338735023408456470580773088295917476714036319800818712901187549131054712658197623331044818386269515456334926366572897563400500428462801835170705278318394258821455212272512503275512160354698120058176216521282765275169129689778932238195734329339946437501907836945765883352399886755061649651847751807381688378610915273579297013376217784275219262340194239963916804498399317331273132924185707147349566916674687634660915035914677504995186714302352196288948901024233251169136196266227326746080059154747183079839286853520694694454072476841822524674417161514036427982273348055556214818971426179103425986472045168939894221798260880768528778364618279934631376775430780936333301898264209010848802521674670883215120185883543223812876952786713296124747824645386369930090493103636197638780396218407357239979422340623539380833965132740801111666627891981488087797941876876144230030984490851411606618262936828367647447792391803351109890697907148578694408955299065364044742557608365997664579509666024396409905389607120198219976047599490197230297649139826800329731560371200413779037855660850892521673093931987275027546890690370753941304265231501194809377245048795150954100921645863754710598436791786391670211874924319957006419179697775990283006991536871371193661495281130587638027841075444973307840789923115535562561142322423255033685442488917353448899115014406480203690680639606723221932041495354150312888033953605329934036800697771065056663195481234880673210146739058568557934581403627822703280826165707739483275922328459417065250945123252306082291880205877731971983945018088807242966198081119777158542502016545090413245809786882778948721859617721078384350691861554356628840622574736922845095162084960398013400172393067166682355524525280460972253503534226472524250874054075591789781264330331690 |
我在该随笔7楼的评论中给出了一个 C# 解答:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
using System;using System.Collections.Generic;using System.Numerics;using System.IO;namespace Skyiv{ static class Sum { static void Main() { BigInteger
sum; foreach (var n
in GetNumerics(Console.In))
sum += n; Console.WriteLine(sum.ToString().Substring(0,
10)); } static IEnumerable<BigInteger>
GetNumerics(TextReader reader) { for (;
; ) { var s
= reader.ReadLine(); if (s
== null)
break; yield return BigInteger.Parse(s); } } }} |
上述程序的运行结果如下所示:
ben@ben-m4000t:~/work/Sum$ dmcs Sum.cs -r:System.Numerics
ben@ben-m4000t:~/work/Sum$ mono28 Sum.exe < input.txt
5537376230
ben@ben-m4000t:~/work/Sum$
上述 C# 语言解答中使用了 BigInteger 结构,不太符合题目的本意,不能体现大整数的算法。现在给出一个 C 语言解答:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include
<stdio.h>#define
OUT_DIGITS 10#define
DIGITS 50#define
GAP 6void add(int sum[],
char buf[]){ int i; for (i
= DIGITS - 1; i >= 0; i--) sum[DIGITS - 1 - i] += buf[i] - ‘0‘;}void format(int sum[]){ int i,
n; for (i
= 0; i < DIGITS + GAP - 1; i++) { n
= sum[i]; sum[i]
= n % 10; sum[i
+ 1] += n / 10; }}void out(int sum[]){ int i,
j; for (i
= DIGITS + GAP - 1; i >= 0; i--) if (sum[i]
!= 0) break; for (j
= i; i >= 0 && i > j - OUT_DIGITS; i--) putchar(sum[i]
+ ‘0‘); putchar(‘\n‘);}int main(){ char buf[BUFSIZ]; int sum[DIGITS
+ GAP]; memset(sum,
0, sizeof(sum)); for (;;) { if (gets(buf)
== NULL) break; if (strlen(buf)
!= DIGITS) return 1; add(sum,
buf); } format(sum); out(sum); return 0;} |
上述程序的运行结果如下所示:
D:\work\sum> tcc sum.c
D:\work\sum> sum < input.txt
5537376230
D:\work\sum>
上述 tcc 是一个 Tiny C Compiler。
根据16楼空军园友的评论,只需计算每个被加数的前12位数字就够了(根据20楼gbb21园友的评论,这是不够的,所以下面的程序是不能正确工作的),所以有如下的程序:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include
<stdio.h>#define
OUT_DIGITS 10#define
DIGITS 50#define
GAP 2typedef long long int64;int main(){ char buf[BUFSIZ]; int64
sum, n; for (sum
= 0; ; ) { if (gets(buf)
== NULL) break; if (strlen(buf)
!= DIGITS) return 1; buf[OUT_DIGITS
+ GAP] = ‘\0‘; sscanf(buf,
"%I64d",
&n); sum
+= n; } sprintf(buf,
"%I64d",
sum); printf("%.*s\n",
OUT_DIGITS, buf); return 0;} |
这个程序的运行结果如下所示:
D:\work\sum> tcc sum2.c
D:\work\sum> sum2 < input.txt
5537376230
D:\work\sum>
而gbb21园友在12楼的评论中认为计算每个被加数的头11位就够了,不知道是不是真的就够,需要不需要计算头12位。
(根据20楼gbb21园友的评论,必须计算全部50位才行。)
版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u013948190/article/details/47254077