2014-12-19 53 views
-2

我想从字符串数组中添加几个50位数字并打印求和的前10位数,但我得到了错误的答案。我的代码出了什么问题? 答案应该是:5537376230 我的答案是:3737623039 p.s.我已经使用了数组存储的总和如何对非常大的数字进行算术运算

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string num[100] = { 
    "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", 
    "146739058568557934581403627822703280", 
    "82616570773948327592232845941706525094512325230608", 
    "22918802058777319719839450180888072429661980811197", 
    "77158542502016545090413245809786882778948721859617", 
    "72107838435069186155435662884062257473692284509516", 
    "20849603980134001723930671666823555245252804609722", 
    "53503534226472524250874054075591789781264330331690", 
    }; 
    long long sum[100]; 
    int runner=0; 
    long long carry=0; 
    for(int l=49;l>=0;l--) 
    { 
     int total=0; 
     for(int k=0;k<100;k++) 
     { 
      total+=(int)num[k][l]-48; 
     } 
     total=total+carry; 
     sum[runner]=total%10; 
     if(total>9)carry=total/10; 
     else carry=0; 
     runner++; 
    } 
    //cout<<runner<<endl; 
    for(int l=runner-1;l>runner-11;l--) 
    { 
     cout<<sum[l]; 
    } 
} 
+0

这个问题不应该被搁置。它满足所有要求。它包含一个完整而短暂的工作示例,并说明预期的和实际的输出。 – amaurea

回答

0

我不知道这是不是唯一的问题的个位数,但使用的是“诠释”它具有以下范围:

-2,147,483,648到2,147,483,647

您的号码很大,因此无法按要求工作。

检查http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx瑟可用的数据类型

+0

你是绝对正确的,他使用的是数组,因此我的回答已经过时了...... – Xavjer

+1

你还没有理解我的代码....我用这个数组来存储总和的单个数字...你可以改变数组很久很久没有看到变化 – newbie

+0

@newbie如果你想得到答案,你可以自行解释代码。它甚至在规则中提到过。许多downvote和密切的投票应该表明有问题 –

2

您的最后一个循环之后,搭载的是55,但你永远不把它插入到的结果。

+0

谢谢你......现在我明白了 – newbie

1

既然你只需要前10数字

int main(int argc, char **argv) 
{ 
    int i; 
    char *num[100] = { 
     "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", 
     "146739058568557934581403627822703280", 
     "82616570773948327592232845941706525094512325230608", 
     "22918802058777319719839450180888072429661980811197", 
     "77158542502016545090413245809786882778948721859617", 
     "72107838435069186155435662884062257473692284509516", 
     "20849603980134001723930671666823555245252804609722", 
     "53503534226472524250874054075591789781264330331690", 
    }; 

    long int sum = 0; 
    for (i = 0 ; i < 100 ; i++) 
    { 
     char firstDigits[15]; 

     memcpy(firstDigits, num[i], 14); 
     firstDigits[14] = 0; 

     sum += strtol(firstDigits, NULL, 10); 
    } 
    char string[11]; 

    snprintf(string, 11, "%ld", sum); 
    fprintf(stderr, "%s\n", string); 

    return 0; 
} 
+0

我不认为这是保证工作。如果每个号码的前15位数字总和为111111111199999,而其余位数的余数为1,那该怎么办?在这种情况下,真正的答案是1111111112,而不是111111111,因为你会在这里。 – amaurea

+0

只有最后一位数字会受此影响,所以它非常安全。由于最后一位数字是第10位后的“4”数字。 –

+0

iharob:并非所有的数字都受此限制?如果我的示例是999999999999985,并且从忽略的数字携带的数字是15,那么正确的结果将是10亿,而不是9999999999。但是,是的,这不应该经常发生 – amaurea

0

你隐含假设,答案将不超过各自的投入,这显然并不在此情况下容纳更多的数字。您确实为输出分配了100位数字,这足够绰绰有余,但您从未填充超过50位数字。我已经去修改你的代码来解决这个问题。

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() 
{ 
    const int nnum = 100, idigits = 50, odigits = 100; 
    string num[nnum] = { 
    "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", 
    "146739058568557934581403627822703280", 
    "82616570773948327592232845941706525094512325230608", 
    "22918802058777319719839450180888072429661980811197", 
    "77158542502016545090413245809786882778948721859617", 
    "72107838435069186155435662884062257473692284509516", 
    "20849603980134001723930671666823555245252804609722", 
    "53503534226472524250874054075591789781264330331690", 
    }; 
    int sum[odigits]; 
    int carry=0, d; 
    for(d=0;d<odigits;d++) 
    { 
    int ipos = idigits-1-d; 
    int opos = odigits-1-d; 
    int total = carry; 
    if(ipos >= 0) 
     for(int k = 0; k < nnum; k++) 
     total += num[k][ipos]-48; 
    else if(carry == 0) break; 
    sum[opos] = total%10; 
    carry = total/10; 
    } 
    for(int i=0; i < 10; i++) 
    cout << sum[odigits-d+i]; 
    cout << "\n"; 
} 

这产生所期望的结果5537376230.

由于int可以保持远不止1十进制数字,更有效的方法是同时处理较大的数字组。

相关问题