数字分隔(二)
时间限制: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;
}