两个极大正整数求和C++源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
using namespace std;
int main()
{
string a, b;
int *sum;
int i, ja, jb;
cout << "请输入两个数字,每个数字以空格结尾:" << endl;
cin >> a >> b;
string temp;
if ( a.size() > b.size() ) // 如果a长度大于b,则交换两字符串
{
temp = a;
a = b;
b = temp;
}
// 在这后,就肯定是a的长度比b小,所以和的位数最大就是b的位数+1。
sum = new int[b.size()+1]; // 所以给和申请b的位数+1个位置。
sum[0] = 0;
char achar[1];
char bchar[1];
int carry = 0; // 记录进位
int sizeDif = b.size() - a.size(); // 记录两个数字的位数差
int count; // 记录和的位数
for ( ja = a.size()-1, jb = b.size()-1; ja >= 0; ja--, jb-- )
{
achar[0] = a[ja];
bchar[0] = b[jb];
sum[jb+1] = atoi(achar) + atoi(bchar) + carry;
carry = 0; // 清空进位标志位
if( sum[jb+1] > 9 )
{
carry = 1;
sum[jb+1] -= 10; // 使之成为一位数,方便输出。
}
}
for ( i = sizeDif-1; i >= 0 ; i-- )
{
bchar[0] = b[i];
sum[i+1] = atoi(bchar)+carry; // 转换为数字
carry = 0; // 清空进位标志位
if( sum[i+1] > 9 )
{
carry = 1;
sum[i+1] -= 10; // 使之成为一位数,方便输出。
}
}
cout << endl << "The process is:" << endl;
for ( i = 0; i <= sizeDif; i++ )
{
cout << " ";
}
cout << a << endl;
cout << "+" << b << endl;
for ( i = 0; i <= b.size(); i++ )
cout << "-";
cout << endl;
if ( carry == 1 ) // 当和的位数为b的位数+1时
{
cout << '1'; // 先输出最高位,否则就不输出。
}
else
{
cout << " ";
}
for ( i = 1; i <= b.size(); i++ )
cout << sum[i];
cout << endl;
cout << endl << "So the result is: ";
int remainder;
if ( carry == 1 ) // 当和的位数为b的位数+1时
{
count = b.size()+1;
sum[0] = 1;
remainder = count%4;
for ( i = 0; i < remainder; i++ )
cout << sum[i];
if ( remainder == 0 )
{
for ( ; remainder < 4; remainder++ )
cout << sum[remainder];
}
for ( i = remainder; i < count; i++ )
{
if ( (i-remainder) % 4 == 0)
cout << ',';
cout << sum[i];
}
}
else
{
count = b.size();
remainder = count%4;
for ( i = 1; i < remainder+1; i++ )
cout << sum[i];
for ( i = remainder+1; i <= count; i++ )
{
if ( (i-remainder-1) % 4 == 0)
cout << ',';
cout << sum[i];
}
}
cout << endl;
return 0;
}