nyoj 1092数字分割(模拟)

                                                                                                                   数字分隔(二)

                                                                   时间限制: 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值