NYIST 1092 数字分隔(二)

来源:互联网 发布:海量数据与数据港谁好 编辑:程序博客网 时间:2024/05/17 23:48

 本题是南阳理工学院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
原创粉丝点击