HDU 1002 A + B Problem II 高精度加法程序 覆盖大量字符串处理基础 详细注释

        高精度A+B题,等于一个小模拟吧,涉及很多字符串基础知识,个人觉得是验证自己是否掌握字符串基础的一道好题。

        题意:A+B=C 。 别逗了,还要我说?

        解法:字符串处理,没什么好说的,注释里清清楚楚(其实是我想睡觉了)。

        注意事项:注意格式问题,等式有空格,输出组间有空行(吐槽:HDU真是无聊)。


想交题目就戳我啊



    下面是我的AC代码:


#include <iostream>
#include <string>
using namespace std;

string str1,str2;

int main()
{
    int t,kase=1;
    cin >> t;                                     //由于本题没有多组数据输入要求,所以我没写while(cin >> t)
    while(t--)                                    //其实写上面说的ACM标准输入那条语句也一样AC
    {
        cin >> str1 >> str2;
        int len1,len2;
        len1=str1.size();                         //测字符串长度函数,string类字符串用这个;char型用strlen()
        len2=str2.size();

        if(len1>=len2)                            //谁大就用谁做基准,下面else语句重复的;
        {
            if(kase>1)                            //如果是第一个结果,就不输出空行,道理是这样的吧
                cout << endl;
            cout << "Case " << kase++ << ':' << endl;  //预处理一大堆垃圾
            cout << str1 << " + " << str2 << " = " ;   //讲道理这个不用解释了吧

            int i,j;
            for(i=len1-1,j=len2-1;j>=0;i--,j--)   //以str1做基准进行字符加法,没毛病,嗯!
            {
                str1[i]+=str2[j]-'0';             //减'0'是因为数字的ASCll值从48开始
                if(str1[i]>'9')                   //大于9就进1啊,注意比较的是字符,注意其ASCll值
                {
                    str1[i]-=10;                  //当前位减10给进位
                    str1[i-1]+=1;                 //下一位进1     *注意这里是真的进1,不是字符'1'
                }
            }
            if(str1[0]>'9')                       //细节,如果首位要进位,那就进行如下处理
            {
                str1[0]-=10;
                for(int k=len1+1;k>=1;k--)        //向后挪一个位置给新来的最高位,注意要把字符串结束标志'\0'一起挪(易错点)
                    str1[k]=str1[k-1];
                str1[0]=1;                        //无论数据是什么,进位最大只能是1(自己写几个数试试?)
            }
            cout << str1 << endl;                 //打印结果
        }
        else                                      //同上,只是换个基准串而已
        {
            if(kase>1)
                cout << endl;
            cout << "Case " << kase++ << ':' << endl;
            cout << str1 << " + " << str2 << " = " ;

            int i,j;
            for(i=len1-1,j=len2-1;i>=0;i--,j--)
            {
                str2[j]+=str1[i]-'0';
                if(str2[j]>'9')
                {
                    str2[j]-=10;
                    str2[j-1]+=1;
                }
            }
            if(str2[0]>'9')
            {
                str2[0]-=10;
                for(int k=len2+1;k>=1;k--)
                    str2[k]=str2[k-1];
                str2[0]=1;
            }
            cout << str2 << endl;
        }
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值