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。所以以后做题前先想想该怎么做,如果是数学题就先想想有那些情况,该怎么做。想清楚再下手会好一点。
给你一个数字,请去掉多余的前导零和后继零(如果小数点多余,也要去掉),将它格式化成常规的数字格式。如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。所以以后做题前先想想该怎么做,如果是数学题就先想想有那些情况,该怎么做。想清楚再下手会好一点。
相关文章推荐
- 数字游戏(解题报告)
- 【九度OJ】题目1069:查找学生信息 解题报告
- TYVJ 1076 数字三角形2 解题报告
- 洛谷1216 数字金字塔 解题报告
- TYVJ 1084 数字三角形4 解题报告
- 1069. The Black Hole of Numbers (20)解题报告
- 解题报告之 幸运数字
- codevs 1164 || NOIP 2007 统计数字 模拟 解题报告
- codevs 1394 数字串 贪心 解题报告
- TYVJ 1069 cowtour 解题报告
- Leetcode 402. Remove K Digits 删除K个数字 解题报告
- 解题报告 数字查找
- Leetcode 412. Fizz Buzz 数字生成 解题报告
- 1068统计数字解题报告
- [解题报告]hdoj1069(动态规划)
- [Scoi2010]幸运数字解题报告
- 习题3-3 数数字 解题报告
- 【NOIP2010TG/codevs1069】 关押罪犯 解题报告
- ZZULI 1234 数字串 解题报告
- vijos P1005 超长数字串 解题报告