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