NYIST 1092 数字分隔(二)

 本题是南阳理工学院ACM网站上的一道字符串处理题,很长时间不敲代码了手生得很,果然码了很长时间~


描述

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

    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.00
    0.00
    (10,005.16)

AC代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    char str[201], a[201];
    while(~scanf("%s", a)) {
        bool neg = false;
        int ten = 0;
        if(a[0] == '-') {
            neg = true;
            a[0] = '0';
            printf("(");
        }
        int len = strlen(a);
        int point = 0;
        for(int i = 0 ; i < len; ++i) {
            if(a[i] == '.') {
                point = i;
                break;
            }
        }
//        printf("point = %d\n", point);
        if(point > 0) {//有小数前导零处理
            int i, j = 0;
            bool flg = true;
            for(i = 0; i < point-1; i++) {
                if(a[i] == '0' && flg) {
                    continue;
                } else {
                    str[j++] = a[i];
                    flg = false;
                }
            }
            str[j++] = a[i];
            str[j++] = '.';
            for(i = point+1; i < len; i++) {
                str[j++] = a[i];
            }
            str[j] = '\0';
        } else {
            int j = 0;
            bool flg = true;
            for(int i = 0; i < len-1; i++) {
                if(a[i] == '0' && flg) {
                    continue;
                } else {
                    str[j++] = a[i];
                    flg = false;
                }
            }
            str[j++] = a[len-1];
            str[j] = '\0';
        }
//        printf("~~~%s~~~\n", str);
        len = strlen(str);
        point = 0;

        for(int i = 0 ; i < len; ++i) {
            if(str[i] == '.') {
                point = i;
                if(i == len-1) {
                    str[len] = str[len+1] = '0';
                    str[len+2] = '\0';
                } else if(i == len-2) {
                    str[len] = '0';
                    str[len+1] = '\0';
                } else if(len-point-1 > 2) {
                    if(str[point+3] >= '5' && str[point+3] <= '9') {

                        if(str[point+2] != '9') {
                            str[point+2] += 1;
                        } else {
                            char c = str[0];
                            for(int t = point+2; t >= 0; t--) {
                                if(str[t] == '.') {
                                    continue;
                                }
                                if(str[t] == '9') {
                                    str[t] = '0';
                                } else {
                                    str[t] += 1;
                                    break;
                                }
                            }
                            if((c == '9' && str[0] == '0')) {
                                ten = 1;
                            }
                        }
                    }
                    str[i+3] = '\0';
                } else {
                    str[i+3] = '\0';
                }
            }
        }
        if(ten) {
            printf("1");
            if(point%3 == 0) {
                printf(",");
            }
        }
        if(point > 0) {//有小数
            if(point <= 3) {
                printf("%s", str);
            } else {
                int i;
                int head = point%3;
                int cnt = 0;;
                for(i = 0; i < head; i++) {
                    printf("%c", str[i]);
                    cnt = 3;
                }
    //            printf("-!%d  %d!-\n", cnt, i);

                for( ; i < point; i++) {
                    if(cnt == 3) {
                        cnt = 0;
                        printf(",");
                    }
                    printf("%c", str[i]);
                    cnt++;
                }
                if(point > 0) {
                    printf(".");
                }
                printf("%c%c", str[point+1], str[point+2]);

            }
        } else {//整数
            int i, head = len%3;
            int cnt = 0;;
            for(i = 0; i < head; i++) {
                printf("%c", str[i]);
                cnt = 3;
            }

            for( ; i < len; i++) {
                if(cnt == 3) {
                    cnt = 0;
                    printf(",");
                }
                printf("%c", str[i]);
                cnt++;
            }
            printf(".00");
        }
        if(neg) {
            printf(")");
        }
        printf("\n");
    }
    return 0;
}

测试样例:

999999999.999999

-999999999.999999

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值