数字分隔(二)
时间限制:
1000 ms | 内存限制:
65535 KB
描述
在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下:
1、实数的整数部分按照每三个数字用逗号分隔开(整数部分的高位有多余的0时,需先将多余的0过滤后,再进行数字分隔,如:0001234567 输出结果为1,234,567.00)
2、小数部分保留两位小数(四舍五入)
3、如果该数是负的,则在输出时需用括号将分隔后的数字括起来,例如:-10005.1645的输出结果为(10,005.16)
输入
多组测试数据,每行输入一个实数n(n的位数小于100)
输出
输出分隔后的结果
样例输入
000123456
0.0000
-10005.1645
样例输出
1,234,567.00
0.00
(10,005.16)
思路:
1、先判断正负,标记r;
2、在判断是否有小数点
小数点后不够两位的就补字符‘0’;
小数点后>3位,判断小数点后第3位 是否>='5',做是否进位的标记m;
接下来就是进位环节;
判断m是否进位 ;
m进位
从小数点后第2位开始依次往前进位;
若本位为小数点所在位,则结束本次循环(contine;)
若m不满足进位,则结束循环;
在m满足进位的条件下;判断本位是否为‘9’;
满足‘9’,本位初始为‘0’;
否则,本位+1,另m=0,继续循环;
没有小数点就直接在后面补小数点和‘0’;
3、去头部除多余的‘0’;(详细看代码)
4、边分隔边输出。(详细看代码)
#include<cstdio>
#include<string.h>
int main()
{
char c[110];
while(~scanf("%s",c+1))
{
c[0]='0';
int a,i,r=0,t=0; //r标记正负 t记录小数点位置 a为字符串的长度
a=strlen(c);
//判断正负
if(c[1]=='-')
{
c[1]='0';
r=1;
}
//判断小数点的有无 及 进位
char *x;
if(x=strchr(c,'.'))
t=x-c;
if(t)
{
if(a-t==1)
{
c[t+1]='0';
c[t+2]='0';
c[t+3]=0;
a=t+3;
}
else if(a-t==2)
{
c[t+2]='0';
c[t+3]=0;
a=t+3;
}
else if(a-t>3)
{
int m;
if(c[t+3]>='5'&&c[t+3]<='9') m=1;
else m=0;
c[t+3]=0;
a=t+3;
for(i=t+2;i>=0;i--)
{
if(i==t) continue;
if(m)
if(c[i]=='9') c[i]='0';
else { c[i]+=1; m=0; }
else break;
}
}
}
else
{
t=a;
c[a]='.';
c[a+1]='0';
c[a+2]='0';
c[a+3]=0;
a+=3;
}
//去除头部多余的‘0’
int k=0; //记录输出字符串的开始
for(i=0;c[i]=='0';i++);
if(c[i]=='.') k=i-1;
else k=i;
//按照规定输出字符串
if(r) putchar('(');
int sum,j=0,z,y; //将处理后的字符串按照格式划分 从k开始 先输出 除以3的余数部分
z=t-k;
y=z/3;
z%=3;
for(i=k;i<k+z;i++,j++)
putchar(c[i]);
if(z&&y) putchar(','); // 除以3的商为0 和 余数为0 不能输出‘,’
for(i=k+z,sum=0;i<t;j++)
{
if(sum==3)
{
sum=0;
putchar(',');
continue;
}
putchar(c[i++]);
sum++;
}
//输出小数部分
putchar(c[t]);
putchar(c[t+1]);
putchar(c[t+2]);
if(r) putchar(')');
puts("");
}
return 0;
}