NYOJ 1092 数字分隔(二)

数字分隔(二)

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

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

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

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

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

输入
多组测试数据,每行输入一个实数n(n的位数小于100)
输出
输出分隔后的结果
样例输入
00012345670.0000-10005.1645
样例输出
1,234,567.000.00(10,005.16)
注-此题为:    NYOJ 1092 数字分隔(二)

思路:       首先,将整数和小数分开,然后,再对小数和整数进行处理 ,需要考虑多种情况,是否为 负, 是否 整数为 0 ,是否小数为 0 .以及 进位  问题

已AC代码:(虽然有点长,但思路还算清晰)

#include<cstring>
#include<cstdio>

char s[200],str[200],ch[200]; //s 为原数  str整数 	ch小数
int temp;
char sc[1000];
  
void chaifei()   // 将整数存入 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',j=0;
		for(i+=1;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';
		}
	}
}
int  xiaoshu()  //将小数倒着存入  sc 中 
{
	int k=0,q=0;
	if(ch[2]>'4')  // 判断 四舍五入 
		q=1;
	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++]='.';
	return q; // 进位  1  或  0 
}

int zhengshu(int q,int k)
{
	int len,i,j,flag=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(flag!=0&&flag%3==0)  //判断是否加 ',' 
			sc[k++]=',';
		flag++;
		sc[k++]=str[i];
	}
	if(q==1)  // 若数为 9.99999时, 整数要向前进位时多了一个 '1'; 
	{
		if(flag!=0&&flag%3==0)   //判断是否加 ',' 
			sc[k++]=',';
		sc[k++]='1';
	}
	return k;
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值