C++ 将两个阵列添加到一起时出现结转问题

C++ 将两个阵列添加到一起时出现结转问题,c++,arrays,addition,C++,Arrays,Addition,我正在写一个程序,将两个最大为20位的大整数相加。到目前为止,我在将这两个数字存储为字符串,然后将它们排序为两个数组方面没有遇到任何问题 到目前为止,我有一半的加法部分工作。当两位数之和不超过两位数时,它工作正常 当数组的总和达到两位数时,就会出现问题。我试着在结转中工作,但它会把不应该添加的数字弄乱。除此之外,我不知道如何使进位显示在最后数字之前。例如:9+9输出到8 这是我的代码,请原谅for循环中的所有字母变量 #include <iostream> #include <

我正在写一个程序,将两个最大为20位的大整数相加。到目前为止,我在将这两个数字存储为字符串,然后将它们排序为两个数组方面没有遇到任何问题

到目前为止,我有一半的加法部分工作。当两位数之和不超过两位数时,它工作正常

当数组的总和达到两位数时,就会出现问题。我试着在结转中工作,但它会把不应该添加的数字弄乱。除此之外,我不知道如何使进位显示在最后数字之前。例如:9+9输出到8

这是我的代码,请原谅for循环中的所有字母变量

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

int main()
{
   string str1;
   string str2;
   int array1[20];
   int array2[20];
   int array3[20];
   string num3[20];
   int i;
   int j = 0;
   int k;
   int l;
   int m = 0;
   int n;
   int o;
   int carry = 0;

   cout<<"Please enter the first number: "<<endl;
   cin>>str1;
   for (int i = str1.length() - 1; i >= 0; i--)
   {
      array1[j] = str1[i];
      j++;
   }

   for (int k = str1.length()-1; k >=0; k--)
   {
      array1[k] = static_cast<int>(str1[k]) - static_cast<int>('0');

   }

   cout<<"Please enter the second number: "<<endl;
   cin>>str2;
   for (int l = str2.length() - 1; l >= 0; l--)
   {
      array2[m] = str2[l];
      m++;
   }

   for (int n = str2.length()-1; n >=0; n--)
   {
      array2[n] = static_cast<int>(str2[n]) - static_cast<int>('0');

   }

   //Where the addition begins
   for (int o = 0; o < str1.length(); o++)
   {
      if (array1[o] + array2[o] > 9)
      {
         array3[o] = array1[o] + array2[o] + carry;
         array3[o] = array3[o] % 10;
         carry = 1;
      }
      else
      {
         array3[o] = array1[o] + array2[o] + carry;
         carry = 0;
      }

      cout<<array3[o];
   }

   return 0;
}
这可以防止第二个数字出现在输出中。我可以想象,如果我禁用它,一旦我们达到数组中的最终数字,它将允许显示最终进位。不幸的是,我尝试过的一切都没有奏效

再次感谢你

试试这个:

   for (int o = 0; o < str1.length(); o++)
   {
      if (array1[o] + array2[o] + carry > 9)
      {
         array3[o] = array1[o] + array2[o] + carry;
         array3[o] = array3[o] % 10;
         carry = 1;
      }
      else
      {
         array3[o] = array1[o] + array2[o] + carry;
         carry = 0;
      }

      cout<<array3[o];
   }

修改for循环以进行添加。在这种情况下,您还需要添加进位

if (array1[o] + array2[o] + carry > 9)
最终for循环如下所示:

for (int o = 0; o < str1.length(); o++)
{

    if (array1[o] + array2[o] + carry > 9)
    {
        array3[o] = array1[o] + array2[o] + carry;
        array3[o] = array3[o] % 10;
        carry = 1;
    }
    else
    {
        array3[o] = array1[o] + array2[o] + carry;
        carry = 0;
    }
    cout<<array3[o];
}
我的建议是:

您可以在一个循环中填写输入字符串中的数字。不需要使用两个循环

for (int i = str1.length() - 1; i >= 0; i--)
{
   array1[j] = str1[i] - '0';
   j++;
}
另一个循环也是如此

当计算总数时,您必须迭代到最长字符串的长度。如果第一个输入是12,第二个输入是4567,那么必须确保迭代在4停止,而不是在2停止

计算总和的算法可简化为:

for (int o = 0; o < len+1; o++)
{
   array3[o] = array1[o] + array2[o] + carry;
   carry = array3[o]/10;
   array3[o] %= 10;
}

如果我是你,我会像我在这里做的那样:

inline bigint &bigint::operator+( const bigint & _expr )
{
    vector<uint8_t> left = this->_digits;
    vector<uint8_t> right = _expr._digits;
    vector<uint8_t> sum;
    uint8_t carry = 0;

    process_operands( left, right ); // makes the two operands have the same length and fills them with leading zeros 

    for( auto lit = left.cbegin(), rit = right.cbegin(); lit != left.cend(), rit != right.cend(); ++lit, ++rit )
    {
        uint8_t temp_sum = ( *lit + *rit + carry ) % 10;
        carry = ( *lit + *rit + carry ) / 10;
        sum.push_back( temp_sum );
    }

    if( carry ) sum.push_back( carry );
    this->_digits = sum;

    return *this;
}
因此,实际上应该停止使用内置数组,因为它们容易出错,而且因为STL提供了更好的东西,比如std::vector。我使用std::vector来存储我的数字,因此,循环数字变得更容易:我们可以使用foruint8_t&c:_digits{}的范围或迭代器

附加前导零将变得更容易,因为您只需执行以下操作:

_digits.push_back( 0 );
在for循环中

int main()
{
char A[20],B[20],C[22]={0};
int carry,len_a,len_b,x=20,i,j,a,b;
printf("First Number");
gets(A);
printf("Second Number");
gets(B);
len_a=strlen(A);
len_b=strlen(B);
for(i=len_a-1;i>=0;i--)
{
    carry=0;
        b=(int)B[i]-48;
        a=(int)A[len_b-1]-48;
        C[x]=C[x]+a+b;
        if(C[x]>9)
        {
            C[x]=C[x]%10;
            C[x-1]+=1;
        }
        x--;
        len_b--;
}
int flag=0;
printf("Result  :");
for(j=0;j<=20;j++)
{ 
    if(C[j]!=0)
    {
        printf("%d",C[j]);
        flag=1;
    }
    else if(C[j]==0 && flag==1)
        printf("%d",C[j]);
}
if(flag==0)
    printf("0");
getch(); 
return 0;
}
class bigint
{
private:
    vector<uint8_t> _digits;
    typedef vector<uint8_t>::size_type size_type;
    bigint( vector<uint8_t> & in );
public:
    bigint() : _digits() {}
    bigint( const string &number );
    // ...
};
_digits.push_back( 0 );
int main()
{
char A[20],B[20],C[22]={0};
int carry,len_a,len_b,x=20,i,j,a,b;
printf("First Number");
gets(A);
printf("Second Number");
gets(B);
len_a=strlen(A);
len_b=strlen(B);
for(i=len_a-1;i>=0;i--)
{
    carry=0;
        b=(int)B[i]-48;
        a=(int)A[len_b-1]-48;
        C[x]=C[x]+a+b;
        if(C[x]>9)
        {
            C[x]=C[x]%10;
            C[x-1]+=1;
        }
        x--;
        len_b--;
}
int flag=0;
printf("Result  :");
for(j=0;j<=20;j++)
{ 
    if(C[j]!=0)
    {
        printf("%d",C[j]);
        flag=1;
    }
    else if(C[j]==0 && flag==1)
        printf("%d",C[j]);
}
if(flag==0)
    printf("0");
getch(); 
return 0;
}