题目
在一个遥远的国家,银行为了更快更好的处理用户的订单,决定将一整串的数字按照一定的规则分隔开来,分隔规则如下:
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;
}