Click here to Skip to main content
14,932,737 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.
   
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
Richard MacCutchan 1-Sep-18 7:29am
   
I think your approach needs a complete rethink. You have a fixed array of numbers as strings that you need to add together. There is no need to use string, stringstream or vector object, just address the characters directly.

One way to do that is to create your own adder routine that works through the strings from right to left, adding together the digits in each position in turn. As you calculate each total you need to store the rightmost digit in a new string. You then divide the resulting total by 10 and continue adding the digits from the next column to the left.
That is an over simplification but it should help to get you where you want to be.
Member 13277493 1-Sep-18 7:50am
   
thanks! I will try that way

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