c语言oj数据通过,一个oj的题,测试数据都对,就是提交错误

已结贴√

问题点数:20 回复次数:12

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

一个oj的题,测试数据都对,就是提交错误

A+B Problem IV

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。

输入

包含多组测试数据

每组数据包含两个正数A,B(可能为小数且位数不大于400)

输出

每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。

样例输入

1.9 0.1

0.1 0.9

1.23 2.1

3 4.0

样例输出

2

1

3.33

7

#include

using namespace std;

bool flag;//标记是否小数部分向整数部分有进位

//计算整数部分的加法

string add_Int(string s1,string s2)

{

if(s1.length()

{

string t=s1;

s1=s2;

s2=t;

}

for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)

{

s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));

if(s1[i]-'0'>=10)

{

s1[i]=char((s1[i]-'0')%10+'0');

if(i)

s1[i-1]++;

else

s1="1"+s1;

}

}

return s1;

}

//计算小数部分的加法

string add_Dec(string s1,string s2)

{

//如果小数的位数不相同

if(s1.length()!=s2.length())

{

if(s1.length()

{

string t=s1;

s1=s2;

s2=t;

}

for(int i=s2.length()-1,j=s2.length()-1;i>=0;i--,j--)

{

s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));

if(s1[i]-'0'>=10)

{

s1[i]=char((s1[i]-'0')%10+'0');

if(i)

s1[i-1]++;

else

flag=true;

}

}

}

//小数部分位数不同

if(s1.length()==s2.length())

{

for(int i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)

{

s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));

if(s1[i]-'0'>=10)

{

s1[i]=char((s1[i]-'0')%10+'0');

if(i)

s1[i-1]++;

else

flag=true;

}

}

}

return s1;

}

int main()

{

string s1,s2;

while(cin>>s1>>s2)

{

string s1_Int,s1_Dec,s2_Int,s2_Dec;

//s1的整数部分,s1的小数部分 ,s2的整数部分,s2的小数部分

int s1_find=s1.find('.');//找到小数点的位置,把整数和小数分开来计算

if(s1_find!=-1)//如果存在小数点

{

for(int i=0;i

s1_Int+=s1[i];

for(int i=s1.find('.')+1;i

s1_Dec+=s1[i];

}

if(s1_find==-1)//如果不存在小数点

{

s1_Int+=s1;

s1_Dec+="0";

}

int s2_find=s2.find('.');//s2的小数点的位置

if(s2_find!=-1)//如果存在小数点

{

for(int i=0;i

s2_Int+=s2[i];

for(int i=s2.find('.')+1;i

s2_Dec+=s2[i];

}

if(s2_find==-1)//如果不存在小数点

{

s2_Int+=s2;

s2_Dec+="0";

}

flag=false;//默认为false如果有小数部分进位,则值为true

string t_Dec=add_Dec(s1_Dec,s2_Dec);//先做小数部分的加法

string t_Int_Carry;//小数加法时向正数有进位

string t_Int;//小数加法向正数没有进位

if(flag)// 如果小数部分向整数部分有进位

t_Int_Carry=add_Int(add_Int(s1_Int,s2_Int),"1");

else//小数部分向整数部分没有进位

t_Int=add_Int(s1_Int,s2_Int);

if(t_Dec=="0")//如果小数部分为零

if(flag)//小数部通过向整数部分进位 产生的0

cout<

else//两个数本来都为整数

cout<

else//小数部分不为零

cout<

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值