Click here to Skip to main content
15,867,686 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
The problem is that istringstream takes the whole string not the elements of that string one by one and so the int that I input from the string buffer gets an overflow of the digits, so the value of "i" becomes false

C++
<pre>#include <iostream>
#include <string>
#include <vector>
#include <sstream>


///NEXT STEPS
//1)conversion of numbers string matrix to int matrix is needed
std::vector<std::vector<int>>convert_to_iv(std::vector<std::vector<std::string>>sv) //multidimensional string vector
{
    std::vector<std::vector<int>>iv;
    for(const auto &row: sv)
    {
        iv.push_back(std::vector<int>());
        for(const auto &v: row)
        {
            std::istringstream ss(v);
            int i;
            ss>>i;
            iv.back().push_back(i);
        }
    }

    return iv;
}

std::vector<int>addition(std::vector<int>&left, std::vector<int>&right)
{
    int carry=0;
    if(left.size()==right.size())
    {
        for(int i=left.size()-1; i>=0; i--)
        {
            if(i==0)
            {
                left[i]=left[i]+right[i]+carry;
                break;
            }
            left[i]=(left[i]+right[i]+carry);
            carry=left[i]/10;
            left[i]=left[i]%10;

        }

    }
    if(left.size()>right.size())
    {
        int right_size=right.size()-1;
        for(int i=left.size()-1; i>=left.size()-right.size(); i--)
        {
            left[i]=left[i]+right[right_size]+carry;
            carry=left[i]/10;
            left[i]=left[i]%10;
            right_size--;
        }

        for(int i=right.size()-1; i>=0; i--)
        {
            left[i]=left[i]+carry;
        }
    }

    if(right.size()>left.size())
    {
        int left_size=left.size()-1;
        for(int i=right.size()-1; i>=right.size()-left.size(); i--)
        {
            right[i]=right[i]+left[left_size]+carry;
            carry=right[i]/10;
            right[i]=right[i]%10;
            left_size--;
        }
        for(int i=left.size()-1; i>=0; i--)
        {
            right[i]=right[i]+carry;
        }
    }

}

std::vector<int>get_sum(std::vector<std::vector<std::string>>sv)
{


    std::vector<int>left;
    std::vector<int>right;

    std::vector<std::vector<int>>iv;
    iv=convert_to_iv(sv);

    for(int col=0; col<50; col++)
    {
        left[col]=iv[0][col];
    }

    for(int row=1; row<100; row++)
    {
        for(int col=0; col<50; col++)
        {
            right[col]=iv[row][col];
        }
        addition(left, right);

    }
    //testing
    for(int i=0; i<left.size()-1; i++)
    {
        std::cout<<left[i]<<" ";
    }



}


int main()
{
    std::vector<int>left{};
    std::vector<int>right{};

    //75778645
    std::vector<std::vector<std::string>>number= {
            {"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"}

    };

    get_sum(number);

}


What I have tried:

I have tried to address "row"s by indexing(not by for-each loop) but the result is the same.
Posted
Updated 31-Aug-18 22:34pm
Comments
Jochen Arndt 1-Sep-18 5:23am    
The elements of a string are characters. If you want to process those you have to iterate over the string elements.

If the string contains a list of integers separated by specific delimiters, you have to split (tokenize) the string and convert each item to int.
Member 13277493 1-Sep-18 5:32am    
yes, they are chars, and the istringstream is one of the ways(if not the only way) to get the integers from the string. In this case, the string does not contain any special delimiter.

1 solution

All those numbers are far too big to be ordinary integers. The maximum value for a signed integer is 2,147,483,647, or 4,294,967,295 for an unsigned.
 
Share this answer
 
Comments
Member 13277493 1-Sep-18 4:55am    
I know that, my question is how can I store not the whole string in "i" but each element of the string then push it to the vector one by one
Richard MacCutchan 1-Sep-18 5:18am    
If you mean each individual digit then you can use the at member function on the underlying string to extract them one at a time.
Member 13277493 1-Sep-18 5:27am    
But will the istringstream buffer accept it as an input? I tried like that, the IDE marks red below. Maybe I made a mistake in writing the code. The code is below. I didn't write the loop for each index of the member, for this example it's just the 0 index element of the string.

std::vector<std::vector<int>>iv;
for(const auto &row: sv)
{
iv.push_back(std::vector<int>());
for(const auto &v: row)
{
const auto v_at=v.at(0);
std::istringstream ss(v);
int i;
ss>>i;
iv.back().push_back(i);
}
}
Richard MacCutchan 1-Sep-18 6:24am    
I am not exactly sure what you are trying to achieve with this code, but it appears quite complex. I would suggest using simple string objects rather than stringstreams. Also, in the case of the stringstream you need to get the string reference to use the at member function. See the documentation (basic_stringstream Class | Microsoft Docs[^]) for the correct way.
Member 13277493 1-Sep-18 6:39am    
yes its complex, the problem is from Project Euler. https://projecteuler.net/problem=13

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900