NYOJ-1092数字分割
来源:互联网 发布:雅虎邮箱网络格式 编辑:程序博客网 时间:2024/05/22 06:20
数字分隔(二)
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述
在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下:1、实数的整数部分按照每三个数字用逗号分隔开(整数部分的高位有多余的0时,需先将多余的0过滤后,再进行数字分隔,如:0001234567 输出结果为1,234,567.00)2、小数部分保留两位小数(四舍五入)3、如果该数是负的,则在输出时需用括号将分隔后的数字括起来,例如:-10005.1645的输出结果为(10,005.16)
输入
多组测试数据(以eof结尾),每行输入一个实数n(n的位数小于100)
输出
输出分隔后的结果
样例输入
00012345670.0000-10005.1645
样例输出
1,234,567.000.00(10,005.16)
/* 细心细心!!,写了半个下午。 注意点:1. 负号的处理,处理数字时应把负号去掉 2.整数情况加.00 3.考虑了整数、x.xxx…、x.xx这种情况,漏掉了x.x 4. 999.999 所以应:先 进位 再 加逗号。 完全用string类来写,时间有点高。*/#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;void conv(int st,int en,string &ans,string inp) //整数部分转化{ int len = inp.length()-1; int cnt=1; for(int i=st;i>=en;) { if(cnt%4==0) ans.push_back(','); else ans.push_back(inp[i--]); cnt++; }}string convert(string &inp){ string ans; if(inp[0]=='-') //有负号 { ans.push_back(')'); inp.erase(0,1); } if(inp.find('.')==string::npos) //只是整数 { ans.append("00."); //整数输出要加.00 while(inp[0]=='0') inp.erase(0,1); int len = inp.length()-1; if(len == -1) ans.push_back('0'); else conv(len,0,ans,inp); } else //小数 { while(inp[0]=='0') inp.erase(0,1); if(inp[0]=='.') inp.insert(0,1,'0'); int len = inp.length()-1; int i; for(i=len;i>=0;i--) if(inp[i]=='.') break; int di=i; if(len-di<=2) //x.xx和x.x情况 { if(len-di==1) ans.push_back('0'); for(int i=len;i>=di;i--) ans.push_back(inp[i]); conv(di-1,0,ans,inp); } else //x.xxx 要考虑进位 如99.999. { if(inp[di+3]-'0'>=5) //第三为大于4 ,考虑进位 { string temp; for(int i=0;i<di;i++) temp.push_back(inp[i]); for(int i=di+1;i<=di+2;i++) temp.push_back(inp[i]); int ll=temp.length()-1; int j=ll,x=1; while(j>=0) { int tt=temp[j]-'0'+x; temp[j]=tt%10+'0'; x=tt/10; j--; } if(x) temp.insert(0,1,x+'0'); ll=temp.length()-1; for(int i=ll;i>=ll-1;i--) ans.push_back(temp[i]); ans.push_back('.'); conv(ll-2,0,ans,temp); } else 第三为<=4,直接输出。 { for(int i=di+2;i>=di;i--) ans.push_back(inp[i]); conv(di-1,0,ans,inp); } } } if(ans[0]==')') ans.push_back('('); reverse(ans.begin(),ans.end()); return ans;}int main(){ string inp,ans; while(cin>>inp) { ans=convert(inp); cout<<ans<<endl; } return 0;}
阅读全文
0 0
- NYOJ-1092数字分割
- nyoj 1092数字分割(模拟)
- nyoj-829-数字分割
- 数字分割
- NYOJ--数字
- nyoj-1003-平面分割
- NYOJ 1092-数字分隔(二)-sdfgdbvc
- NYOJ 1092 数字分隔(二)
- 【NYOJ】[1092]数字分隔(二)
- NYOJ 1092 数字分隔(二)
- NYOJ 1092:数字分隔(二)【JAVA 】
- nyoj-664-数字整除
- NYOJ 664 数字整除
- NYOJ 664 数字整除
- NYOJ 664 数字整除
- NYOJ-最高位数字
- nyoj-664-数字整除
- nyoj-1143-数字游戏
- 前端学习 -- clear:both的探索
- vim 格式设置
- 埃式筛法——快速筛选n以内的素数
- 盒子模型外边距问题&display&visible&浮动
- 如何让 Python 像 Julia 一样快地运行
- NYOJ-1092数字分割
- Android缓存处理
- Android用surface直接显示yuv数据(三)
- andorid查看某个进程占用的内存
- SSH框架电力项目八--运行监控的保存
- 理解 LSTM 网络
- Hadoop Hive sql语法详解3--DML 操作:元数据存储
- Android用surface直接显示yuv数据(一)
- css中高度塌陷介绍以及定位介绍