NYOJ 数字分隔(二)

 

数字分隔(二)

时间限制: 1000 ms  |  内存限制: 65535 KB

描述

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

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

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

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

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

输出分隔后的结果

 

样例输入

000123456
0.0000
-10005.1645

 

样例输出

1,234,567.00
0.00
(10,005.16)
 

 

思路:
1、先判断正负,标记r;
2、在判断是否有小数点
 
小数点后不够两位的就补字符‘0’;
小数点后>3位,判断小数点后第3位 是否>='5',做是否进位的标记m;
接下来就是进位环节;
判断m是否进位 ;
 
m进位
从小数点后第2位开始依次往前进位;
若本位为小数点所在位,则结束本次循环(contine;)
若m不满足进位,则结束循环;
在m满足进位的条件下;判断本位是否为‘9’;
满足‘9’,本位初始为‘0’;
否则,本位+1,另m=0,继续循环; 
 
没有小数点就直接在后面补小数点和‘0’;    
3、去头部除多余的‘0’;(详细看代码)
4、边分隔边输出。(详细看代码)
#include<cstdio>
#include<string.h>
int main()
{
	char c[110];
	while(~scanf("%s",c+1))
	{
		c[0]='0';
		int a,i,r=0,t=0;       //r标记正负 t记录小数点位置  a为字符串的长度 
		a=strlen(c);
		
		//判断正负 
		if(c[1]=='-')
		{
			c[1]='0';
			r=1;
		}
		
		//判断小数点的有无  及 进位 
		char *x;
		if(x=strchr(c,'.'))
			t=x-c;
		if(t)
		{
			if(a-t==1)
			{
				c[t+1]='0';
				c[t+2]='0';
				c[t+3]=0;
				a=t+3;
			}
			else if(a-t==2)
			{
				c[t+2]='0';
				c[t+3]=0;
				a=t+3;
			}
			else if(a-t>3)
			{
				int m;
				if(c[t+3]>='5'&&c[t+3]<='9') m=1;
				else m=0;
				c[t+3]=0;
				a=t+3; 
				for(i=t+2;i>=0;i--)
				{
				    if(i==t) continue;
					if(m)
					    if(c[i]=='9') c[i]='0';
						else { c[i]+=1; m=0; }
					else break;
				}
			}
		}
		else 
		{
			t=a;
			c[a]='.';
			c[a+1]='0';
			c[a+2]='0';
			c[a+3]=0;
			a+=3;
			
		}
		
		//去除头部多余的‘0’ 
		int k=0;                   //记录输出字符串的开始 
		for(i=0;c[i]=='0';i++);
		if(c[i]=='.') k=i-1;
		else k=i;
		
		//按照规定输出字符串 
		if(r) putchar('(');
		
		int sum,j=0,z,y;         //将处理后的字符串按照格式划分  从k开始 先输出 除以3的余数部分 
		z=t-k;
		y=z/3;
		z%=3;
		for(i=k;i<k+z;i++,j++)
		     putchar(c[i]);
		if(z&&y) putchar(',');   // 除以3的商为0 和 余数为0 不能输出‘,’
		
		for(i=k+z,sum=0;i<t;j++)
		{
			if(sum==3)
			{
				sum=0;
				putchar(',');
				continue;
			}
			putchar(c[i++]);
			sum++;
		}
		
		//输出小数部分 
		putchar(c[t]);
		putchar(c[t+1]);
		putchar(c[t+2]);
		
		if(r) putchar(')');
		puts("");
	}
	return 0;
}

 
 
 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值