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
    评论
以下是51单片机控制的12864液晶显示系统编程实现所需的代码: ``` #include <reg51.h> #include <intrins.h> #define LCD_DB P0 sbit LCD_RS = P2^6; // RS信号 sbit LCD_RW = P2^5; // RW信号 sbit LCD_E = P2^7; // E信号 sbit LCD_CS1 = P2^0; // CS1信号 sbit LCD_CS2 = P2^1; // CS2信号 void delay(unsigned int i) // 延时函数 { while(i--); } void write_com(unsigned char com) // 写命令函数 { LCD_RS = 0; LCD_RW = 0; LCD_DB = com; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; } void write_data(unsigned char dat) // 写数据函数 { LCD_RS = 1; LCD_RW = 0; LCD_DB = dat; LCD_E = 1; _nop_(); _nop_(); LCD_E = 0; } void init_lcd() // 初始化函数 { write_com(0xc0); // 设置显示模式 write_com(0x3f); // 允许显示 write_com(0x40); // 设置起始地址 write_com(0xb8); // 设置页地址 write_com(0xc0); // 设置列地址 write_com(0x40); // 设置起始地址 write_com(0xb8); // 设置页地址 write_com(0xc0); // 设置列地址 } void display_string(unsigned char x, unsigned char y, unsigned char *s) // 显示字符串函数 { unsigned char i; if(y == 0) // 第一行居中显示“南阳理工学院” { write_com(0xb8 + x); write_com(0x40); } else if(y == 1) // 第行居中显示“www.nyist.edu.cn” { write_com(0xb8 + x); write_com(0x48); } else if(y == 2) // 第三行居中显示“电子信息工程专业” { write_com(0xb8 + x); write_com(0x50); } else if(y == 3) // 第四行居中显示尚春芳 { write_com(0xb8 + x); write_com(0x58); } for(i = 0; s[i] != '\0'; i++) { write_data(s[i]); } } void main() { init_lcd(); // 初始化LCD display_string(18, 0, "南阳理工学院"); // 显示第一行 display_string(16, 1, "www.nyist.edu.cn"); // 显示第行 display_string(16, 2, "电子信息工程专业"); // 显示第三行 display_string(22, 3, "尚春芳"); // 显示第四行 while(1); } ``` 以上代码实现了你提出的要求,第一行居中显示“南阳理工学院”,第行居中显示“www.nyist.edu.cn”,第三行居中显示“电子信息工程专业”,第四行居中显示尚春芳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值