1.两个非负大数相加:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=110;
string add(string a,string b)//只限两个非负整数相加
{
string ans;
int na[L]={0},nb[L]={0};
int la=a.size();
int lb=b.size();
// 倒叙存储
for(int i=0;i<la;i++)
na[la-1-i]=a[i]-'0';
// 倒叙存储
for(int i=0;i<lb;i++)
nb[lb-1-i]=b[i]-'0';
int lmax=la>lb?la:lb;
// 从个位开始计算
for(int i=0;i<lmax;i++)
{
na[i]+=nb[i];
na[i+1]+=na[i]/10;
na[i]%=10;
}
// 去除前置0
if(!na[lmax])
lmax--;
for(int i=lmax;i>=0;i--)
ans+=na[i]+'0';
return ans;
}
int main()
{
string a,b;
while(cin>>a>>b)
cout<<add(a,b)<<endl;
return 0;
}
2.一正一负相加:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10010;
char a[maxn],b[maxn];
int aa[maxn],bb[maxn];
void add(char str1[],char str2[])
{
memset(aa,0, sizeof(aa));
memset(bb,0, sizeof(bb));
int len1 = strlen(str1);
int len2 = strlen(str2);
int flag1 = 0,flag2 = 0;
// 都是0的时候特殊处理
if (str1[0] == '0' && str2[0] == '0')
printf("0\n");
else
{
// str1是负数
if (str1[0] == '-')
{
flag1 = 1;
for (int i=0;i<len1-1;i++)
{
aa[i] = str1[len1-1-i] - '0'; //倒叙记录
}
}
else
{
// str1是正数
for (int i=0;i<len1;i++)
{
aa[i] = str1[len1-1-i] -'0';
}
}
//str2是负数
if (str2[0] == '-')
{
flag2 = 1;
for (int i=0;i<len2-1;i++)
{
bb[i] = str2[len2-1-i] - '0';
}
}
else
{
// str2是正数
for (int i=0;i<len2;i++)
{
bb[i] = str2[len2-1-i]- '0';
}
}
//分四种情况对str1,str2处理
if (!flag1 && !flag2) //str1 和 str2都是正数
{
int len = max(len1,len2);
for (int i=0;i<len;i++)
{
bb[i] += aa[i];
bb[i+1] += bb[i]/10;
bb[i]%=10;
}
//处理前置零
while (!bb[len])
len--;
for (;len>=0;len--)
printf("%d",bb[len]);
printf("\n");
}
else if (!flag1 && flag2) // str1是正数,str2是负数
{
int ans = 0;
//判断str1和str2的绝对值谁大谁小
if (len1>len2-1)
ans = 1;
else if (len1 == len2-1)
{
for (int i=len1-1;i>=0;i--)
{
if (aa[i]>bb[i])
{
ans = 1;
break;
}
else if (aa[i]<bb[i])
{
ans = 0;
break;
}
}
}
// 如果str1的绝对值更大
if (ans)
{
for (int i=0;i<len1;i++)
{
aa[i] -= bb[i];
while (aa[i]<0)
{
aa[i] += 10;
aa[i+1]--;
}
}
//处理前置零
while (!aa[len1])
len1--;
for (;len1>=0;len1--)
printf("%d",aa[len1]);
printf("\n");
}
else // 如果str2的绝对值更大
{
for (int i=0;i<len2-1;i++)
{
bb[i] -= aa[i];
while (bb[i]<0)
{
bb[i]+=10;
bb[i+1]--;
}
}
//处理前置零
while (!bb[len2])
len2--;
if (len2<0) // 注意333 -333 的情况
printf("0\n");
else
{
for (;len2>=0;len2--)
printf("%d",bb[len2]);
printf("\n");
}
}
}
else if (flag1 && !flag2) //str1为负数 str2为正数
{
int ans = 0;
// 判断str1 和 str2 的绝对值的大小
if (len2>len1-1)
{
ans = 1;
}
else if (len2 == len1-1)
{
for (int i = len2 - 1; i >= 0; i--)
{
if (aa[i] > bb[i])
{
ans = 0;
break;
}
else if (bb[i] > aa[i])
{
ans = 1;
break;
}
}
}
//判断结果的正负
if (ans)
{
for (int i=0;i<len2;i++)
{
bb[i] -= aa[i];
while (bb[i]<0)
{
bb[i]+=10;
bb[i+1]--;
}
}
//处理前置0
while (!bb[len2])
len2--;
for (;len2>=0;len2--)
printf("%d",bb[len2]);
printf("\n");
}
else
{
for (int i=0;i<len1-1;i++)
{
aa[i] -= bb[i];
while (aa[i]<0)
{
aa[i]+=10;
aa[i+1]--;
}
}
//处理前置0
while (!aa[len1])
len1--;
if (len1<0) // 注意333 -333 的情况
printf("0\n");
else
{
printf("-");
for (;len1>=0;len1--)
{
printf("%d",aa[len1]);
}
printf("\n");
}
}
}
else if (flag1 && flag2) // 都是负数
{
printf("-");
int len = max(len1,len2);
for (int i=0;i<len-1;i++)
{
bb[i] += aa[i];
bb[i+1] += bb[i]/10;
bb[i]%=10;
}
while (!bb[len])
len--;
for (;len>=0;len--)
printf("%d",bb[len]);
printf("\n");
}
}
}
int main()
{
while (cin >> a >> b)
{
add(a,b);
}
return 0;
}



京公网安备 11010502036488号