参照了别人的思路。
代码:
#include <cstdio>
#include <cstring>
const int maxn = 120;
char s[maxn];
int main()
{
while(~scanf("%s",s + 1))
{
int flag = 0; //标记是否有负号
char* point;
int len ; //字符串长度
int pt ; //小数点的位置,如果没有小数点就是字符串的长度
s[0] = '0';
len = strlen(s);
if(s[1] == '-')
{
flag = 1;
s[1] = '0';
}
if(point = strchr(s,'.'))
{
pt = point - s;
}
else pt = len;
//printf("len - pt = %d\n",len - pt);
if(len - pt > 3) //处理进位 如果小数位大于等于3位
{
//printf("test\n");
if(s[pt + 3] > '4') // 如果第3位小数大于4
{
if(++s[pt + 2] > '9')
{
s[pt + 2] = '0';
if(++s[pt + 1] > '9')
{
s[pt + 1] = '0';
s[pt - 1]++;
}
}
int i = pt - 1;
while(s[i] > '9')
{
s[i--] = '0';
++s[i];
}
}
s[pt + 3] = '\0';
//printf("%s\n",s);
}
else if(len - pt == 2) //1个小数位
{
s[len++] = '0';
s[len] = '\0';
}
else if(len - pt == 1) //没有小数位,只有小数点
{
s[len++] = '0';
s[len++] = '0';
s[len] = '\0';
}
else if(len - pt == 0) //整数
{
s[len++] = '.';
s[len++] = '0';
s[len++] = '0';
s[len] = '\0';
}
int start;
for(start = 0; s[start] == '0'; ++start); //去除前导零
if(s[start] == '.') --start;
if(flag)
printf("(");
while(start < pt) //输出整数部分
{
printf("%c",s[start++]);
if(start != pt && (pt - start) % 3 == 0)
{
printf(",");
}
}
printf("%s",s + pt); //小数部分
if(flag) printf(")");
printf("\n");
}
return 0;
}