大数相加,要考虑是否进位,多位数相加的时候,用数组可能会爆,老师告诉我们可以用string来保留数组的作用,而且不会有位数的限制。
道理都差不多,只是表示的方法不同。
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
char mmm(char &x,char y,char z)
{
int A=x+y+z-3*48;
x=A%10+'0';
return A/10+'0';
}
int main()
{
string hk,ls,HK;
char l;
int len,len1,a;
cin>>a;
while(a--)
{
while(cin>>hk>>HK)
{
if(hk.length()<HK.length())
{
ls=hk;
hk=HK;
HK=ls;
}
len=HK.length()-1;
len1=hk.length()-1;
l='0';
while(len1>=0)
{
if(len>=0) l=mmm(hk[len1--],HK[len--],l);
else l=mmm(hk[len1--],'0',l);
}
if(l!='0')
{
cout<<l;
}
cout<<hk;
}
}
return 0;
}
数组方法;
#include <stdio.h>
#include <string.h>
#define MAX_LEN 200
int an1[MAX_LEN+10];
int an2[MAX_LEN+10];
char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];
int main(void)
{
scanf("%s", szLine1);
scanf("%s", szLine2);
int i, j;
memset( an1, 0, sizeof(an1));
memset( an2, 0, sizeof(an2));
int nLen1 = strlen( szLine1);
for( j = 0, i = nLen1 - 1;i >= 0 ; i --)
an1[j++] = szLine1[i] - '0';
int nLen2 = strlen(szLine2);
for( j = 0, i = nLen2 - 1;i >= 0 ; i --)
an2[j++] = szLine2[i] - '0';
for( i = 0;i < MAX_LEN ; i ++ )
{ an1[i] += an2[i]; //逐位相加
if( an1[i] >= 10 )
{ //看是否要进位
an1[i] -= 10;
an1[i+1] ++; //进位
}
}
for( i = MAX_LEN; (i >= 0) && (an1[i] == 0); i -- ) ;
if(i>=0)
for( ; i >= 0; i--)
printf("%d", an1[i]);
else printf("0");
return 0;
}
string 用起来比较方便。