zoj_2476 Total Amount

题目链接:zoj 2476

本以为把蓝书做完了,没想到 还有一条漏网之鱼……

该题的综合性比较强,涉及到字符串处理、进位处理、反转容器、输出格式处理。


处理字符串要注意一下几点:

1. 输入时删除“$"和 ","以及“.”

    用到string::erase(int a, int b)函数,是将字符串从第a个位置(包括a)后的b个字符删除

2. 输出时添加“$"和 ","以及“.”

    用一个临时字符串t保存结果,将t舒适化为空串,将结果字符串(倒置的情况下)的字符挨个追加到t后。因为是保留两位小数,所以在第二个字符后添加".",在小数点之后、能被3整除的字符数后添加","。最后将t赋值给原结果字符串。

    输出时,先输出"$",在从后往前反向输出结果字符串。


计算的技巧是:

1.选较长的字符串作为第一个加数,较短的作为第二个加数,如果第一个数比第二个数位数少,用swap(string a, string b)函数将二者交换。计算结果保存在第一个字符串中,与下一个输入的字符串继续相加。

2.将加数字符串倒置,从最低位开始相加,使用一个整数变量flag表示进位,若两位的和小于10,flag为0,否则flag为1,并且将和减去10保存在结果字符串中,下一位相加时要把进位flag也加上。

3.当较短的字符串各位已经加完,就把短字符串中少于长字符串的位都置为0.若长字符串的各位也加完,仍有进位1,要在结果字符串末尾追加1.


#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
    //ifstream cin("a.txt");
    string sa,sb,t;
    int pa,pb,pc; //pc=pa+pb;
    int n,flag;
    map<int ,char> m;

    m[0]='0';
    m[1]='1';
    m[2]='2';
    m[3]='3';
    m[4]='4';
    m[5]='5';
    m[6]='6';
    m[7]='7';
    m[8]='8';
    m[9]='9';

    while(cin>>n)
    {
        if(n==0) break;
        for(int i=0; i<n; i++)
        {
            cin>>sb;
            sb.erase(0,1);                     //删除$符号
            t="";
            for(int j=0; j<sb.size(); j++)
                if(sb[j]!=',')  t+=sb[j];  //删除","符号
            sb=t;
            reverse(sb.begin(),sb.end());
            sb.erase(2,1);                   //删除"."符号
            if(i==0) sa=sb;                // 读入的是第一个字符串
            else
            {
                flag=0;                            //进位标志置为0
                if(sa.size()<sb.size()) swap(sa,sb);
                for(int j=0; j<sa.size(); j++)
                {
                    pa=sa[j]-48;
                    if(j>=sb.size()) pb=0;
                    else pb=sb[j]-48;
                    pc=pa+pb+flag;
                    if(pc>9)
                    {
                        pc-=10;
                        flag=1;
                    }
                    else flag=0;
                    sa[j]=m[pc];
                }
                if(flag==1) sa+="1";
            }
        }
        t="";
        for(int i=0;i<sa.size();i++)
        {
            t+=sa[i];
            if(i==1) t+="."; //加入小数点
            if(i!=1 && (i-1)%3==0 && i!=(sa.size()-1)) t+=","; //加入逗号
        }
        sa=t;
        cout<<"$";
        for(int i=sa.size()-1;i>=0;i--) cout<<sa[i]; //反向输出结果
        cout<<endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值