NYOJ-1092数字分割

xiaoxiao2021-02-28  40

数字分隔(二)

时间限制:1000 ms | 内存限制:65535 KB 难度:3

描述

在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下: 1、实数的整数部分按照每三个数字用逗号分隔开(整数部分的高位有多余的0时,需先将多余的0过滤后,再进行数字分隔,如:0001234567 输出结果为1,234,567.00) 2、小数部分保留两位小数(四舍五入) 3、如果该数是负的,则在输出时需用括号将分隔后的数字括起来,例如:-10005.1645的输出结果为(10,005.16)

输入

多组测试数据(以eof结尾),每行输入一个实数n(n的位数小于100)

输出

输出分隔后的结果

样例输入

0001234567 0.0000 -10005.1645

样例输出

1,234,567.00 0.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; }
转载请注明原文地址: https://www.6miu.com/read-600395.html

最新回复(0)