问题标题: 酷町堂:1096 a+b

0
0
已解决
王源松
王源松
新手光能
新手光能
#include <iostream>
#include <string>
using namespace std;
string a1,b1,c1;
int a[100000],b[1000000],c[10000000],jw;
void w(){
    a[0]=a1.size();
    b[0]=b1.size();
    c[0]=max(a[0],b[0]);
    for(int i=0;i<a[0];i++){
        a[a[0]-i]=a1[i]-'0';
    }
    for(int i=0;i<b[0];i++){
        b[b[0]-i]=b1[i]-'0';
    }
    for(int i=1;i<=c[0];i++){
        c[i]=a[i]+b[i]+jw;
        jw=c[i]/10;
        c[i]%=10;
    }
    if(jw){
        c[0]++;
        c[c[0]]=jw;
    }
    for(int i=c[0];i>=1;i--){
        cout<<c[i];
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a1>>b1;
        w();
        if(i!=n)
        cout<<endl;
    } 
    return 0;
}

为什么0分???

求大佬解答;


0
已采纳
徐云皓
徐云皓
新手天翼
新手天翼

这道题需要使用到高精度。

0
0
张舒斌
张舒斌
中级光能
中级光能

这道题需要使用到高精度。

string x,y;
	cin>>x>>y;
	int lena,lenb,lenc=0;
	int jw=0;
	lena=x.size();
	lenb=y.size();
	for(int i=0;i<lena;i++)
	{
		a[i]=x[lena-1-i]-48;
	} 
	for(int i=0;i<lenb;i++)
	{
		b[i]=y[lenb-1-i]-48;
	}

首先,定义字符串,用数组逆向(这对下面的运算非常重要)存放进去。由于这是全局变量,数组自动赋值为“0”

接下来:

while(lenc<lena||lenc<lenb)
	{
		c[lenc]=a[lenc]+b[lenc]+jw;
		if(c[lenc]>=10)
		{
			c[lenc]-=10;
			c[lenc+1]++;
			jw=1;
		}
		else
		{
			jw=0;
		}
		lenc++;
	}

用数组模拟我们平常的竖式计算由于是反向存放进数组里的,所以当位数不同时,自动补全的零会按照高精度加法的模拟运算进行相加。注意,如果有进位还要把进位加上

最后输出:

if(jw==1)
	{
		cout<<jw;
	}
	for(int i=lenc-1;i>=0;i--)
	{
		cout<<c[i];
	}

输出依然要注意进位,因为如果是99+1的话,得数是100,但进位一旦忽略,结果就会是00

数组定义自己加,根据我讲述的流程适当的定义数组(当然,还有考虑到数据范围的多少来定义,还有,我只是对一组数字进行高精度运算,如何进行多组数运算,自己想,提供代码只供参考,并非标准答案)

张舒斌在2018-07-24 12:37:21追加了内容

望采纳

我要回答