数字分隔(二)

描述

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

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

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

 

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

输入

多组测试数据(以eof结尾),每行输入一个实数n(n的位数小于100)

输出

输出分隔后的结果

样例输入

0001234567
0.0000
-10005.1645

样例输出

1,234,567.00
0.00
(10,005.16)

来源

calamity_coming

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[205]; //s 为原数  str整数 	ch小数
char str[105],ch[105];
char sc[500];
int temp,k,q;

void divide()// 将整数存入 str   小数存入 ch
{
    memset(str,'\0',sizeof(str));
    memset(ch,'\0',sizeof(ch));
    int len,i,j;
    len = strlen(s);
    for (i=0;i<len;i++)//判断是否为负,去除前导 0
    {
        if (s[i]=='-')
        {
            temp = 0;
            continue;
        }
        if (s[i]!='0')
            break;
    }
    if (s[i]=='.')// 前导 0 去掉后 第一位为 '0' ,时 ,整数为 '0'
    {
        str[0] = '0';
        for (i+=1,j=0;i<len;i++)
            ch[j++] = s[i];
        for (;j<5;j++)//小数位数不够 5 (大于 3 就ok) 补 '0',为后面计算方便
            ch[j] = '0';
    }
    else if (i==len)// 若 只输入 '0'
    {
        str[0] = '0';
        for (j=0;j<5;j++)
            ch[j] = '0';
    }
    else//整数有值
    {
        for (j=0;i<len;i++)
        {
            if (s[i]=='.')// 整数存放结束
                break;
            str[j++] = s[i];
        }
        if (i==len)//如果没有小数时
            for (j=0;j<5;j++)
                ch[j] = '0';
        else//有小数时
        {
           for (i+=1,j=0;i<len;i++)
                ch[j++] = s[i];
            for (;j<5;j++)
                ch[j] = '0';
        }
    }
}

void xiaoshu()//将小数倒着存入  sc 中
{
	if (ch[2]>'4')// 判断 四舍五入
		q = 1;// 进位  1  或  0
	ch[1] += q;
	q = 0;
	if (ch[1]>'9') //是否进位
	{
		q = 1;
		ch[1] -= 10;
	}
	sc[k++] = ch[1];
	ch[0] += q;
	q = 0;
	if (ch[0]>'9')
	{
		q = 1;
		ch[0] -= 10;
	}
	sc[k++] = ch[0];
	sc[k++] = '.';
} 

void zhengshu()
{
	int len,i,j,flg = 0;
	len = strlen(str);
	for (i=len-1;i>=0;i--)//同样倒着存入 sc
	{
		str[i] += q;
		q = 0;
		if (str[i]>'9')// 判断是否进位
		{
			str[i] -= 10;
			q = 1;
		}
		if (flg!=0 && flg%3==0)//判断是否加 ','
			sc[k++] = ',';
		flg++;
		sc[k++] = str[i];
	}
	if (q==1)// 若数为 9.99999时, 整数要向前进位时多了一个 '1';
	{
		if (flg!=0 && flg%3==0)
			sc[k++] = ',';//判断是否加 ','
		sc[k++] = '1';
	}
}

int main()
{
	while(scanf("%s",s)!=EOF)
	{
		temp= 1;//  1 没有 '-' 号  0 有 '-' 号
		k = 0,q = 0;//q 小数向整数 进位  0 或 1
		divide();//调用,将整数和小数分开
		xiaoshu();
		zhengshu();
		if (temp==0)// 负号处理
			printf("(");
		for (int i=k-1;i>=0;i--)//倒着输出
			printf("%c",sc[i]);
		if (temp==0)
			printf(")");
		printf("\n");
	} 
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值