首页 > 代码库 > NYOJ1092 数字分隔(二)

NYOJ1092 数字分隔(二)

数字分隔(二)

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

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

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

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

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

输入
多组测试数据,每行输入一个实数n(n的位数小于100)
输出
输出分隔后的结果
样例输入
00012345670.0000-10005.1645
样例输出
1,234,567.000.00(10,005.16)
上传者
ACM_孙毓阳

#include <stdio.h>
#include <string.h>

#define maxn 110

char buf[maxn];

int main() {
    int sign, left, dot, i, len;
    char *ch;
    while(scanf("%s", buf + 1) != EOF) {
        sign = 0;
        buf[0] = '0';
        if(buf[1] == '-') {
            sign = 1;
            buf[1] = '0';
        }
        len = strlen(buf);
        if(ch = strchr(buf, '.')) {
            dot = ch - buf;
        } else dot = len;



        // 以下处理进位
        if(len - dot > 3) {
            if(buf[dot+3] > '4') {
                if(++buf[dot+2] > '9') {
                    buf[dot+2] = '0';
                    if(++buf[dot+1] > '9') {
                        buf[dot+1] = '0';
                        ++buf[dot-1];
                    }
                }
                i = dot - 1;
                while(buf[i] > '9') {
                    buf[i--] = '0';
                    ++buf[i];
                }
            }
            buf[dot+3] = '\0';
        } else if(len - dot == 2) {
            buf[len++] = '0';
            buf[len] = '\0';
        } else if(len - dot == 1) {
            buf[len++] = '0';
            buf[len++] = '0';
            buf[len] = '\0';
        } else if(len - dot == 0) {
            buf[len++] = '.';
            buf[len++] = '0';
            buf[len++] = '0';
            buf[len] = '\0';
        }

        // printf("%s...\n", buf);

        // 以下去前导零
        for(left = 0; buf[left] == '0'; ++left)
            ;

        // 输出整数部分
        if(buf[left] == '.') --left;
        if(sign) putchar('(');
        while(left < dot) {
            putchar(buf[left++]);
            if(left != dot && (dot - left) % 3 == 0)
                putchar(',');
        }
        // 输出小数部分
        printf("%s", buf + dot);
        if(sign) putchar(')');
        putchar('\n');
    }
    return 0;
}


NYOJ1092 数字分隔(二)