您的位置:首页 > 其它

1069,格式化数字解题报告

2015-01-17 13:58 232 查看
描述(时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte);
给你一个数字,请去掉多余的前导零和后继零(如果小数点多余,也要去掉),将它格式化成常规的数字格式。如0001000.0100000应该格式化为1000.01。

输入
输入包含多组测试样例,每组数据包含一个数字(不超过1000位),每个数字占一行。

样例输入
0001000.0100000

010.000

样例输出
1000.01

10

Ps:千万注意要充分考虑各种情况!
AC代码:
#include<stdio.h>

#include<string.h>

#define N 1000

int main()

{

char a[N+10];int f1,f2,f3,i,j,k,l,t; //f1标记第一个非0数,f2标记小数点,f3标记最后一个非0数;


while(scanf("%s",a)!=EOF)

{

f1=f2=f3=-1; //先把f1、2、3都赋值为-1;若扫到了对应的数,f就为对应的项数,若没有,f仍为-1;

for(i=0;i<=strlen(a);i++) //从a[0]开始扫小数点。

{

if(a[i]=='.')

{

f2=i;

break;

}

}

for(j=0;j<=strlen(a);j++) //从a[0]开始扫第一个不为‘0’的字符的项数。

{

if(a[j]!='0')

{

f1=j;

break;

}

}

if(f2!=-1){ //如果小数点存在,那么就找出小数点后最后一个不为0的数并记下项数。

for(k=strlen(a)-1;k>=f2;k--)

{

if(a[k]=='0')

continue;

else

{

f3=k;

break;

}

}

}

if(f2!=-1) //从这开始的代码思路见后文;

{

if((f1==f2)&&(f3==f2))

{

printf("0\n");

}

else if((f1==f2)&&(f3!=f2))

{

printf("0");

for(i=f2;i<=f3;i++)

putchar(a[i]);

putchar(10);

}

else if((f1!=f2)&&(f3==f2))

{

for(i=f1;i<f3;i++)

putchar(a[i]);

putchar(10);

}

else if((f1!=f2)&&(f3!=f2))

{

for(i=f1;i<=f3;i++)

putchar(a[i]);

putchar(10);

}

}

else

{

if(f1==strlen(a))

{

for(i=0,t=0;i<strlen(a);i++)

{

if(a[i]!='0')

{

putchar(a[i]);

t=1;

}

}

if(t==0)

putchar('0');

putchar(10);

}

else

{

for(i=f1;i<strlen(a);i++)

putchar(a[i]);

putchar(10);

}

}

}

return 0;

}


后文:
所有数据的情况可分为两种:一、f2!=-1,即存在小数点的数据;二、f2==-1,即不存在小数点的数据;
情况一:既然存在小数点,肯定就要考虑f1,f3;
1:f1==f2,f3==f2;比如说:00.00,00000.00000,0,00.,.00,‘.’;此时f1==f2并且f3==f2,并且此时的数字化简后一定是'0',所以只用printf("0\n");即可。
2:f1==f2,f3!=f2; 例如:0.100,0.001;此时只用先输出一个0,再从f2输出到f3即可。即{printf("0");for(i=f2;f<=f3;i++)putchar(a[i]);}。
3:f1!=f2,f3==f2; 例如:1000.000,X.0000(X>0);此时只用从f1开始,逐个输出到f2的前一项即可。即{for(i=f1;i<f2;i++)putchar(a[i]);}.
4::f1!=f2,f3!=f2; 例如:1000.0001,10010.01001;此时只用从f1开始逐个输出到f3结束即可。即{for(i=f1;i<=f3;i++)putchar(a[i]);}.
情况二:既然不存在小数点,那么f3就不用考虑,只用考虑f1的情况;
1:f1==strlen(a);即第一个非0的数字是否存在不确定。这时候分两种情况,存在并且在最后、不存在;(如00001,或00000)。如果是前者,只需从第0项到第最后一项把不是0的数全部输出就行(如果输出执行了一次,就表示这个数不全是0,此时把t赋值为1,表示这个数不是全0),如果循环结束后没有输出过一次,那么这个数肯定全都是0,(此时t==0),那么这时候就可以做一个判断,如果t==0,那么就printf("0\n");这种情况就写完了。
2:f1!=strlen(a);即第一个非0的数字存在且不在最后。这时候只需从f1开始输出,一直到字符串末尾就行了。{for(i=f1;i<=strlen(a);i++)putchar(a[i]);}。

总结:这道题就这么完了。。其实思路要是理清了这题目并不难,但是如果没理清,代码会长很多,而且很大可能结果都是worng answer。所以以后做题前先想想该怎么做,如果是数学题就先想想有那些情况,该怎么做。想清楚再下手会好一点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: