您的位置:首页 > 其它

nyoj 1092数字分割(模拟)

2016-05-20 21:53 381 查看
                                                                                                                   数字分隔(二)

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

描述
在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下:

1、实数的整数部分按照每三个数字用逗号分隔开(整数部分的高位有多余的0时,需先将多余的0过滤后,再进行数字分隔,如:0001234567 输出结果为1,234,567.00)

2、小数部分保留两位小数(四舍五入)

3、如果该数是负的,则在输出时需用括号将分隔后的数字括起来,例如:-10005.1645的输出结果为(10,005.16)  

输入多组测试数据,每行输入一个实数n(n的位数小于100)
输出输出分隔后的结果
样例输入
0001234567


0.0000


-10005.1645

样例输出
1,234,567.


000.00


(10,005.16)


分析:

按照题意转化为字符串,然后处理进位,小数,模拟得到结果!

#include<stdio.h>
#include<string.h>
char b[110];
int main()
{
int s,l,d,i,len;
char *ch;
while(scanf("%s",b+1)!=EOF)
{
s=0;
b[0]='0';
if(b[1]=='-')
{
s=1;
b[1]='0';
}
len=strlen(b);
if(ch=strchr(b,'.'))//查找字符串中首次出现.的位置
d=ch-b;
else
d=len;

if(len-d>3)//处理进位
{
if(b[d+3]>'4')//如果小数大于4
{
if(++b[d+2]>'9')
{
b[d+2]='0';
if(++b[d+1]>'9')//如果大于9,进位
{

b[d+1]='0';
++b[d-1];
}
}
i=d-1;
while(b[i]>'9')
{
b[i--]='0';
++b[i];
}
}
b[d+3]='\0';
}
else if(len-d==2)//如果有一位小数,加0
{
b[len++]='0';
b[len]='\0';
}
else if(len-d==1)//如果只有小数点,再加00
{
b[len++]='0';
b[len++]='0';
b[len]='\0';
}
else if(len-d==0)//如果没有小数点,就直接加.00
{
b[len++]='.';
b[len++]='0';
b[len++]='0';
b[len]='\0';
}
for(l=0; b[l]=='0'; ++l);//除去前导0
if(b[l]=='.')//输出整数部分
--l;
if(s)
putchar('(');
while(l<d)
{
putchar(b[l++]);
if(l!=d&&(d-l)%3==0)//
putchar(',');
}
printf("%s",b+d);//输出小数部分
if(s)
putchar(')');
putchar('\n');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: