您的位置:首页 > 其它

zoj_2476 Total Amount

2015-04-03 11:38 134 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: