开发者

Is this a valid way to take a list of digit characters and use them to create a long integer?

开发者 https://www.devze.com 2023-02-22 08:41 出处:网络
Is this a valid way to take a list of digit characters and use them to create a long integer? LongInt operator+(const LongInt& x, const LongInt& y)

Is this a valid way to take a list of digit characters and use them to create a long integer?

LongInt operator+(const LongInt& x, const LongInt& y)
{
    int xCount = 1;
    long int xValue = 0;
    list<char>::iterator it;

    //x.val is a list<char> that contains the digits needed to create the long int
    for(it = x.val.begin(); it != x.val.end(); it++)
    {
        xValue = xV开发者_开发问答alue + (*it - '0');
        xCount++;
    }
}

The purpose of xCount is to keep track of the type of number it is (1's, 10's, 100's, 1000's, etc).

LongInt is a custom class which has a list called val. This method is supposed to take the two LongInt objects, convert their list to Long Ints, then add them together. I know I'm missing the code for the y object but I wanted to make sure I have the x down before I try for y.

Thanks in advance!


No, and I explained how to do it in your previous thread, except that I was wrong with the reverse iterator. You have to start from the beginning not the end. Sorry about that confusion.. This should be enough:

   list<char> digits;
   digits.push_back('1');
   digits.push_back('2');
   digits.push_back('3');

   long int xValue = 0;
   list<char>::iterator it;

   for(it = digits.begin(); it != digits.end(); it++)
   {
      xValue = xValue * 10 + (*it - '0');
   }

Let's say the list is {'1','2', '3'}. Initially xvalue is 0, then it becomes 0*10+1, which is 1. Then it 1*10 + 2 = 12. Last 12 * 10 + 3 = 123.


If LongInt is a class that can have arbitrary precision, it can't be converted to primitive data type like long int xValue.

If you want to add two LongInts, then you've to do it manually. Character by characer. For example, if x = "174", y = "43", then you're program will do the following:

carry = 0;

174
 43
  ^---- 4 + 3 + carry = 7, carry = 0

174
 43
 ^----- 7 + 4 + carry = 1, carry = 1

174
 43
^------ 1 + 0 + carry = 2, carry = 0

From the algorithm above, the result is "217", which you should store in another LongInt and return that.


Am I missing something about operator overloading (sp? :-) ? Why not just forget about xCount and just:

long xValue = 0;
for(it = x.val.rbegin(); it != x.val.rend(); it++) 
{
  xValue = xValue * 10 + ( *it - '0');
}

What does xCount have to do with it?


You need to be taking 10^ to the xCount power, anyway (but you don't increment it anywhere). xCount should probably be the length of your number. The if statement should have == and be if(xCount == 1), but you don't need to distinguish that, because you can consider the first digit multiplier as 10^0.

"123" = 1*10^2+2*10^1+2*10^0
0

精彩评论

暂无评论...
验证码 换一张
取 消