      * Author: Dennis Decker Jensen
      * Date: 4 July 2015
      * Purpose: Calculate first 10 digits of large sum of numbers.
      * Tectonics: cobc -x euler013.cob
      * Method: Since the COBOL standard allows no more than 36 digits
      *         in a number, we split up a 50 digit number in 2 smaller
      *         numbers and add them with carry to a running total.
      *         WITH 100 NUMBERS WE GET SOME OVERFLOW DUE TO 100 CARRIES
      *         SO WE ADD 4 DIGITS TO THE MOST SIGNIFICANT NUMBER.
       identification division.
       program-id. euler013.
       data division.
       working-storage section.
       01  num-table.
           05  num-max-row             pic 999     value 100 comp.
           05  num-cur-row             pic 999               comp.
           05  num-data                pic X(5000) value
               "37107287533902102798797998220837590246510135740250" &
               "46376937677490009712648124896970078050417018260538" &
               "74324986199524741059474233309513058123726617309629" &
               "91942213363574161572522430563301811072406154908250" &
               "23067588207539346171171980310421047513778063246676" &
               "89261670696623633820136378418383684178734361726757" &
               "28112879812849979408065481931592621691275889832738" &
               "44274228917432520321923589422876796487670272189318" &
               "47451445736001306439091167216856844588711603153276" &
               "70386486105843025439939619828917593665686757934951" &
               "62176457141856560629502157223196586755079324193331" &
               "64906352462741904929101432445813822663347944758178" &
               "92575867718337217661963751590579239728245598838407" &
               "58203565325359399008402633568948830189458628227828" &
               "80181199384826282014278194139940567587151170094390" &
               "35398664372827112653829987240784473053190104293586" &
               "86515506006295864861532075273371959191420517255829" &
               "71693888707715466499115593487603532921714970056938" &
               "54370070576826684624621495650076471787294438377604" &
               "53282654108756828443191190634694037855217779295145" &
               "36123272525000296071075082563815656710885258350721" &
               "45876576172410976447339110607218265236877223636045" &
               "17423706905851860660448207621209813287860733969412" &
               "81142660418086830619328460811191061556940512689692" &
               "51934325451728388641918047049293215058642563049483" &
               "62467221648435076201727918039944693004732956340691" &
               "15732444386908125794514089057706229429197107928209" &
               "55037687525678773091862540744969844508330393682126" &
               "18336384825330154686196124348767681297534375946515" &
               "80386287592878490201521685554828717201219257766954" &
               "78182833757993103614740356856449095527097864797581" &
               "16726320100436897842553539920931837441497806860984" &
               "48403098129077791799088218795327364475675590848030" &
               "87086987551392711854517078544161852424320693150332" &
               "59959406895756536782107074926966537676326235447210" &
               "69793950679652694742597709739166693763042633987085" &
               "41052684708299085211399427365734116182760315001271" &
               "65378607361501080857009149939512557028198746004375" &
               "35829035317434717326932123578154982629742552737307" &
               "94953759765105305946966067683156574377167401875275" &
               "88902802571733229619176668713819931811048770190271" &
               "25267680276078003013678680992525463401061632866526" &
               "36270218540497705585629946580636237993140746255962" &
               "24074486908231174977792365466257246923322810917141" &
               "91430288197103288597806669760892938638285025333403" &
               "34413065578016127815921815005561868836468420090470" &
               "23053081172816430487623791969842487255036638784583" &
               "11487696932154902810424020138335124462181441773470" &
               "63783299490636259666498587618221225225512486764533" &
               "67720186971698544312419572409913959008952310058822" &
               "95548255300263520781532296796249481641953868218774" &
               "76085327132285723110424803456124867697064507995236" &
               "37774242535411291684276865538926205024910326572967" &
               "23701913275725675285653248258265463092207058596522" &
               "29798860272258331913126375147341994889534765745501" &
               "18495701454879288984856827726077713721403798879715" &
               "38298203783031473527721580348144513491373226651381" &
               "34829543829199918180278916522431027392251122869539" &
               "40957953066405232632538044100059654939159879593635" &
               "29746152185502371307642255121183693803580388584903" &
               "41698116222072977186158236678424689157993532961922" &
               "62467957194401269043877107275048102390895523597457" &
               "23189706772547915061505504953922979530901129967519" &
               "86188088225875314529584099251203829009407770775672" &
               "11306739708304724483816533873502340845647058077308" &
               "82959174767140363198008187129011875491310547126581" &
               "97623331044818386269515456334926366572897563400500" &
               "42846280183517070527831839425882145521227251250327" &
               "55121603546981200581762165212827652751691296897789" &
               "32238195734329339946437501907836945765883352399886" &
               "75506164965184775180738168837861091527357929701337" &
               "62177842752192623401942399639168044983993173312731" &
               "32924185707147349566916674687634660915035914677504" &
               "99518671430235219628894890102423325116913619626622" &
               "73267460800591547471830798392868535206946944540724" &
               "76841822524674417161514036427982273348055556214818" &
               "97142617910342598647204516893989422179826088076852" &
               "87783646182799346313767754307809363333018982642090" &
               "10848802521674670883215120185883543223812876952786" &
               "71329612474782464538636993009049310363619763878039" &
               "62184073572399794223406235393808339651327408011116" &
               "66627891981488087797941876876144230030984490851411" &
               "60661826293682836764744779239180335110989069790714" &
               "85786944089552990653640447425576083659976645795096" &
               "66024396409905389607120198219976047599490197230297" &
               "64913982680032973156037120041377903785566085089252" &
               "16730939319872750275468906903707539413042652315011" &
               "94809377245048795150954100921645863754710598436791" &
               "78639167021187492431995700641917969777599028300699" &
               "15368713711936614952811305876380278410754449733078" &
               "40789923115535562561142322423255033685442488917353" &
               "44889911501440648020369068063960672322193204149535" &
               "41503128880339536053299340368006977710650566631954" &
               "81234880673210146739058568557934581403627822703280" &
               "82616570773948327592232845941706525094512325230608" &
               "22918802058777319719839450180888072429661980811197" &
               "77158542502016545090413245809786882778948721859617" &
               "72107838435069186155435662884062257473692284509516" &
               "20849603980134001723930671666823555245252804609722" &
               "53503534226472524250874054075591789781264330331690".
           05  nums redefines num-data pic X(50) occurs 100 times.
       01  running-sum.
           05  a-num               pic 9(29) value zero.
           05  b-num               pic 9(26) value zero.
           05  sum-num             pic 9(26) value zero.
           05  carry               pic 9     value zero.
           05  sum-total-txt       pic X(54).
       01  running-sum-edited.
           05  a-num-edited        pic X(29) value zeroes.
           05  b-num-edited        pic X(26) value zeroes.
       01  10-digits               pic X(10).

       procedure division.
       main-paragraph.
           perform varying num-cur-row from 1 by 1
                   until num-cur-row > num-max-row
      * Add to the least significant number B.
               move zero to sum-num
               move nums(num-cur-row)(26:25) to sum-num
               add sum-num to b-num

      * Extract the carry.
               move b-num to b-num-edited
               move zero to b-num
               move b-num-edited(1:1) to carry
               move b-num-edited(2:)  to b-num

      * Add to the most significant number A - plus carry.
               move zero to sum-num
               move nums(num-cur-row)(1:25) to sum-num
               add sum-num, carry to a-num
           end-perform

      * Extract large sum and the 10 first digits.
           move a-num to a-num-edited
           move b-num to b-num-edited
           move b-num-edited(2:) to sum-total-txt(30:)
           move a-num-edited     to sum-total-txt(1:29)
           INSPECT SUM-TOTAL-TXT replacing leading ZEROES by spaces
           move FUNCTION TRIM(sum-total-txt LEADING)(1:10)
               to 10-digits

           display "The first 10 digits of large sum: " 10-digits
           display "Large sum:"
           display sum-total-txt.
           stop run.
       end program euler013.
