分类: C/C++
2012-05-29 21:12:14
第一节程序设计大赛的题目为6道,个人认为难点在“日期推算”和“可怜的蚂蚁”这两个问题上面。可以我偏偏却失足在“林老师的作业”这道题目上了。我们回顾一个原题,如下所示。
“林老师的作业”
小强不喜欢C语言,可是又必须完成林老师的作业,所以非常苦恼,但又得常常编程到深夜。上次林老师又布置了一道作业:给你一个非负的双精度浮点数D,然后将D向下取整转化成一个整数N。D的下取整就是把小数部分舍去,只留下整数部分。比如3.14的下取整就是3。
但是现在他遇到了一个麻烦的问题,就是C语言中的双精度浮点数的表示范围是远远大于整型数的表示范围的。你能帮助小强解决这个问题吗?
输入:只有一个双精度浮点数D,D用十进制小数表示,长度不大于300。D一定为非负数。D有可能存在前导零,即会出现07.09的情况,此时应该输出7,也有可能去掉前导零,比如.009,此时应该输出0。D也有可能为整数,如D=4,不包含小数点,此时应该输出4。除此之外,都是正常书写小数的习惯了。
输出:输出一个整数N,就是D的下取整。
从题目的意思上一看就可以知道,题目像让我们做的是整数部分的提取。
一个很容易的想法就是运用C语言中int取整的想法,但是题目所提及的长度限制是300,远远大于int整数的范围。所以应该用字符串的知识,即用一个str[ ]来存储数据。
解决了数据存储的问题以后,我们所面临的问题就是如何提取整数部分。
这时,我们可以列出所有的情况,得:
1. 07.09(以零开头的小数,且整数部分部位零)
2. .09(直接以小数点开始的小数)
3. 00.09(两个及以上个0开头的小数)
4. 107.09(正常小数)
考虑到以上4种情况之后,我们就可以进行编程了。
以下是我比赛完成之后所编的程序,而且结果正确。现在列出来给大家分享分享自己的遗憾。失之毫厘谬以千里啊。T T
点击(此处)折叠或打开
因为比赛结果是实时更新的,当时看着前几名的选手都只花了几分钟的时间就完成了这道题,我很是崩溃。我拼命的改程序,到最后还是没有出来,纵使我把所有的情况的输入都试了一遍,且结果正确,但是系统还是错误。
接着,我就这样看着时间一点一点的……就是到现在,我还是不知道哪里出了问题,我想可能和当时太紧张有关系吧。总是,吃一堑,则你懂得!
就此文以缅怀,望告以来者,淡定!淡定!
2012/5/15 记
wenfeng_ji2012-05-31 16:32:50
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LEN 303
int main()
{
char num[MAX_LEN];
int flag = 0;
int i;
scanf("%s", num);
for(i = 0; i < (int)strlen(num);i++)
{