B - 大明A+B

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1
Sample Output
4
3.4555434454
2.1

题解:
模拟加法运算
思想很简单,就是细节比较繁琐
我的建议就是做一步,然后输出中间值来检查是否达到自己预期效果,如果达不成,则反复修改,直到完成预期效果
不要等到代码全部写完,再去判断结果对不对

代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

using namespace std;

int main(){
    string a,b;
    int az[500],ay[500];
    int bz[500],by[500];
    int sumz[500],sumy[500];
    int flag=0;//flag判断小数点后是否进位
    while(cin>>a>>b){
        memset(az,0,sizeof(az));
        memset(ay,0,sizeof(ay));
        memset(bz,0,sizeof(bz));
        memset(by,0,sizeof(by));
        memset(sumz,0,sizeof(sumz));
        memset(sumy,0,sizeof(sumy));
        flag=0;
        int flagflag=0;
        int flaga=0,flagb=0;//分别标记a,b小数点的位置
        for(int i=0;i<a.length();i++){
            if(a[i]=='.'){
                flagflag=1;
                flaga=i;//找a的小数点的位置
                break;
            }
        }
        if(flagflag==0){
            flaga=a.length();
        }
        flagflag=0;
        for(int i=0;i<b.length();i++){
            if(b[i]=='.'){
                flagflag=1;
                flagb=i;//找b的小数点的位置
                break;
            }
        }
        if(flagflag==0){
            flagb=b.length();
        }
        int leny,lenay,lenby;
        int lenz,lenaz,lenbz;
        lenay=a.length()-flaga-1;
        lenaz=flaga;
        lenby=b.length()-flagb-1;
        lenbz=flagb;
        leny=lenay>lenby?lenay:lenby;//右边数的最长长度
        lenz=lenaz>lenbz?lenaz:lenbz;//左边数的最长长度
        //cout<<leny<<endl;
        //cout<<lenz<<endl;
        int lenyflag=leny;
        int lenzflag=lenz;
        for(int i=flaga+1;i<a.length();i++){
            lenyflag--;
            if(i>flaga+1+leny){
                ay[lenyflag]=0;
            }
            else{
                ay[lenyflag]=a[i]-'0';
            }
        }
        /*for(int i=0;i<leny;i++){
            cout<<ay[i];
        }
        cout<<endl;*/
        lenyflag=leny;
        for(int i=flagb+1;i<b.length();i++){
            lenyflag--;
            if(i>flagb+1+leny){
                by[lenyflag]=0;
            }
            else{
                by[lenyflag]=b[i]-'0';
            }
        }
        /*for(int i=0;i<leny;i++){
            cout<<by[i];
        }*/
        int j=0;
        for(int i=flaga-1;i>=0;i--){
            az[j++]=a[i]-'0';
        }
        /*for(int i=0;i<lenz;i++){
            cout<<az[i];
        }
        cout<<endl;*/
        j=0;
        for(int i=flagb-1;i>=0;i--){
            bz[j++]=b[i]-'0';
        }
        /*for(int i=0;i<lenz;i++){
            cout<<bz[i];
        }*/
        flagflag=0;
        for(int i=0;i<leny-1;i++){
            sumy[i]=ay[i]+by[i];
            if(sumy[i]>9){
                sumy[i]=sumy[i]-10;
                ay[i+1]++;
            }
        }
        sumy[leny-1]=ay[leny-1]+by[leny-1];
        if(sumy[leny-1]>9){
            flagflag=1;
            sumy[leny-1]-=10;
        }
        if(leny==1){
            sumy[0]=ay[0]+by[0];
            if(sumy[0]>9){
                sumy[0]-=10;
                flagflag=1;
            }
        }
        //cout<<flagflag<<endl;
        for(int i=0;i<leny;i++){
            if(sumy[i]==0){
                sumy[i]=10;
            }
            else{
                break;
            }
        }
        int ifdoz=0;
        for(int i=0;i<leny;i++){
            if(sumy[i]!=10){
                ifdoz=1;
            }
        }
        az[0]=az[0]+flagflag;
        for(int i=0;i<lenz-1;i++){
            sumz[i]=az[i]+bz[i];
            if(sumz[i]>9){
                sumz[i]-=10;
                az[i+1]++;
            }
        }
        sumz[lenz-1]=az[lenz-1]+bz[lenz-1];
        if(sumz[lenz-1]>9){
            sumz[lenz-1]-=10;
            sumz[lenz]=1;
            lenz++;
        }
        for(int i=lenz-1;i>=0;i--){
            cout<<sumz[i];
        }
        if(ifdoz==1){
            cout<<".";
            for(int i=leny-1;i>=0;i--){
                if(sumy[i]!=10){
                    cout<<sumy[i];
                }
            }
        }
        cout<<endl;


    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

veit sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值