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.
本以为把蓝书做完了,没想到 还有一条漏网之鱼……
该题的综合性比较强,涉及到字符串处理、进位处理、反转容器、输出格式处理。
处理字符串要注意一下几点:
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; }
相关文章推荐
- ZOJ 2476 Total Amount
- zoj 2476 Total Amount(模拟题,细节处理特别多)
- ZOJ Problem Set - 2476 Total Amount
- ZOJ 2476 Total Amount
- ZOJ 2476 Total Amount (字符串处理)
- zoj 2476 Total Amount
- B-Total Amount (ZOJ 2476)
- zoj 2476 Total Amount
- ZOJ 2476 Total Amount
- zoj 2476 Total Amount
- zoj 2476 Total Amount(水~)
- zoj 2476 Total Amount
- zoj 2476 Total Amount
- ZOJ 2476 Total Amount 字符串
- ZOJ 2476 Total Amount 字符串
- ZOJ-2476
- Total Amount zoj 2476
- zoj 2476
- 【求助】zoj 2476求和水题
- zoj 2103 Marco Popo the Traveler