数字分隔

题目

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

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

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

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

输入

输入一个实数n(n的位数小于100)

输出

分隔后的结果

样例输入

0001234567

样例输出

1,234,567.00

源码

#include<stdio.h>
#include<string.h> 
int main(void)
{
	int count,k,i,j,flag=0,y,q,e,length;
	char a[100],b[120],c[250];
	//a[100]用以存放输入的数据,回结束输入 
	scanf("%s",a);
	//负数 
	k=0;
	if(a[0]=='-'){
		k=1; 
	}
	//过滤多余0
	//数字不为负数 
	count=0;
	if(k==0){
		for(i=0;a[i]!='\0';i++){
			if(a[i]!='0'){
				flag=1;
				break;
			}
		}
		for(j=i;a[j]!='\0';j++){
			b[count++]=a[j];
		}
	}
	else{
		for(i=1;a[i]!='\0';i++){
			if(a[i]!='0'){
				flag=1;
				break;
			}
		}
		for(j=i;a[j]!='\0';j++){
			b[count++]=a[j];
		}
	}
	b[count]='\0';
	y=0;
	//末尾保留两位有效数字
	for(i=0;b[i]!='\0';i++){
		//找到小数点了 
		if(b[i]=='.'){
			break; 
			y=1; 
		}
	} 
	//并未找到小数点,得自己加上 
	if(y==0){
		b[i]='.';
		b[i+1]='0';
		b[i+2]='0';
		b[i+3]='\0';	
	}
	//找到小数点,开始进行四舍五入算法 
	else{
		q=0;
		for(e=i+1;b[e]!='\0';e++){
			q++;
		}
		if(q>=3){
			//有超两位小数,但是四舍五入影响其值 
			if((b[i+3]-'0'+5)>=10){
				if((b[i+2]-'0'+1)>=10){
					if((b[i+1]-'0'+1)>=10){
						b[i-1]=b[i-1]-'0'+1+'0';
						b[i+1]=b[i+2]='0';
						b[i+3]='\0';
					}
					else{
						b[i+1]=b[i+1]-'0'+1+'0';
						b[i+2]='0';
						b[i+3]='\0';
					}
				}
				else{
					b[i+1]=b[i+1];
					b[i+2]=b[i+2]-'0'+1+'0';
					b[i+3]='\0';
				}
			}
			//有超两位小数,但是四舍五入不影响 
			else{
				b[i+1]=b[i+1];
				b[i+2]=b[i+2];
				b[i+3]='\0';
			} 
		}
		//总共有两位小数 
		if(q==2){
			b[i+3]='\0';
		}
		//总共有一位小数 
		if(q==1){
			b[i+2]='0';
			b[i+3]='\0';
		}
	} 
	length=strlen(b);
	//正数 
	if(k==0){
		c[0]=b[length-1];
		c[1]=b[length-2];
		c[2]='.';
		count=0;
		j=3;
		for(i=length-4;i>=0;i--){
			c[j]=b[i];
			count++;
			j++;
			if(i!=0&&count%3==0){
				c[j]=',';
				j++;
			}
		} 
		c[j]='\0';
		for(i=strlen(c)-1;i>=0;i--){
			printf("%c",c[i]);
		}
	}
	//负数 
	else{
		printf("(");
		c[0]=b[length-1];
		c[1]=b[length-2];
		c[2]='.';
		count=0;
		j=3;
		for(i=length-4;i>=0;i--){
			c[j]=b[i];
			count++;
			j++;
			if(i!=0&&count%3==0){
				c[j]=',';
				j++;
			}
		} 
		c[j]='\0';
		for(i=strlen(c)-1;i>=0;i--){
			printf("%c",c[i]);
		}
		printf(")"); 
	}
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值