货币求和

来源:互联网 发布:足球卡牌手游 知乎 编辑:程序博客网 时间:2024/04/29 18:51

1.题目
给出一列标准格式的货币数字,清计算出它们的总和。
我们定义货币使用下面的格式:
(1) 货币以”$”符号打头;
(2) 如果货币小于1,则整数部分是一个”0”;
(3) 货币都有两位小数;
(4) 货币的小数点左边的每三位都用逗号隔开位一组(最左边的一组可能是一位或两位数字)。
2. 输入描述
输入数据包含多个测设案例。每个测设案例的第一行是一个整数N(1N10000), 表示该测设案例中的数字的个数。接下来的N行包含N个数字。每个数字和所有数字的和在$0.00到$ 20000000.00的闭区间中。N=0表示输入的结束。
3. 输出描述
对于每个测设案例,输出货币的总和。
4. 输入样例
2
$ 1,234,567.89
$ 9,876,543.21
3
$ 0.01
$ 0.10
$ 1.00
0
5. 输出案例
$ 11,111,111.10
$ 1.11
解答:本题看起来简单,但实际处理起来需要注意很多细节。需要进行字符串处理、进位处理、反转容器算法、输出格式处理。代码如下:
//Coins.cpp

#include <fstream>#include <iostream>#include <string>#include <map>using namespace std;int main(int argc, char* argv[]) {    //ifstream cin("aaa.txt");    string sa, sb, t;    int pa, pb, pc;    //定义映照容器    map<char, int>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;    //定义映照容器    map<int, char>mm;    mm[0] = '0';    mm[1] = '1';    mm[2] = '2';    mm[3] = '3';    mm[4] = '4';    mm[5] = '5';    mm[6] = '6';    mm[7] = '7';    mm[8] = '8';    mm[9] = '9';    int n, i, j;    //进位标记,0表示无进位,1表示有进位    int flag = 0;    while (cin >> n)    {        if (n == 0)break;        for (i = 0; i < n; i++)        {            cin >> sb;            //删除"$"符号            sb.erase(0, 1);            //删除","符号            t = "";            for (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;            //sa+sb            else {                //进位标志设为0,即无进位                flag = 0;                //把长的字符串放到sa里                if (sa.size() < sb.size()) {                    t = sa; sa = sb; sb = t;                }                for (j = 0; j < sa.size(); j++)                {                    pa = m[sa[j]];                    if (j >= sb.size()) pb = 0;                    else pb = m[sb[j]];                    pc = pa + pb + flag;                    if (pc > 9)                    {                        pc = pc - 10;                        flag = 1;//有进位                    }                    else                        flag = 0;//进位标记清0                    sa[j] = mm[pc];                }                //如果有进位,则需再加一位                if (flag == 1) sa += "1";            }        }        //加入小数点和逗号        t = "";        for (i = 0; i < sa.size(); i++)        {            t = t + sa[i];            //加"."号            if (i == 1) t = t + ".";            //加"."号            if (i != 1 && (i - 1) % 3 == 0 && i != (sa.size() - 1))                t = t + ",";        }        sa = t;        //反向输出结果        cout << "$";        for (i = sa.size() - 1; i >= 0; i--)            cout << sa[i];        cout << endl;    }    return 0;}

效果如下:

这里写图片描述

0 0
原创粉丝点击