Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30375
  • 博文数量: 9
  • 博客积分: 233
  • 博客等级: 二等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-30 14:56
文章分类
文章存档

2012年(9)

我的朋友
最近访客

分类: C/C++

2012-05-29 21:12:14


第一节程序设计大赛的题目为6道,个人认为难点在“日期推算”和“可怜的蚂蚁”这两个问题上面。可以我偏偏却失足在“林老师的作业”这道题目上了。我们回顾一个原题,如下所示。

“林老师的作业”

小强不喜欢C语言,可是又必须完成林老师的作业,所以非常苦恼,但又得常常编程到深夜。上次林老师又布置了一道作业:给你一个非负的双精度浮点数D,然后将D向下取整转化成一个整数ND的下取整就是把小数部分舍去,只留下整数部分。比如3.14的下取整就是3

但是现在他遇到了一个麻烦的问题,就是C语言中的双精度浮点数的表示范围是远远大于整型数的表示范围的。你能帮助小强解决这个问题吗?

输入:只有一个双精度浮点数DD用十进制小数表示,长度不大于300D一定为非负数。D有可能存在前导零,即会出现07.09的情况,此时应该输出7,也有可能去掉前导零,比如.009,此时应该输出0D也有可能为整数,如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


点击(此处)折叠或打开

  1. #include<stdio.h>

  2. void main()

  3. {

  4.          char s[303];

  5.          int i,j,start;

  6.          scanf("%s",s);

  7.          j=0;

  8.          start=0;

  9.          for(i=0;;i++)

  10.          {

  11.                    if(s[i]=='0'&&j==0)

  12.                    {

  13.                             continue;

  14.                    }

  15.                    if(s[i]=='.')

  16.                    {

  17.                             if(start==0)

  18.                             {

  19.                                      putchar('0');

  20.                                       putchar('\n');

  21.                                      break;

  22.                             }

  23.                             if(start==1)

  24.                             {

  25.                                      putchar('\n');

  26.                                      break;

  27.                             }

  28.                    }

  29.                    putchar(s[i]);

  30.                    start=1;

  31.          }

  32. }

因为比赛结果是实时更新的,当时看着前几名的选手都只花了几分钟的时间就完成了这道题,我很是崩溃。我拼命的改程序,到最后还是没有出来,纵使我把所有的情况的输入都试了一遍,且结果正确,但是系统还是错误。

接着,我就这样看着时间一点一点的……就是到现在,我还是不知道哪里出了问题,我想可能和当时太紧张有关系吧。总是,吃一堑,则你懂得!

就此文以缅怀,望告以来者,淡定!淡定!

2012/5/15

阅读(1182) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

cubeduer2012-07-06 10:08:02

wenfeng_ji: #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LEN 303
int main()
{
        char num[MAX_LEN];
        int flag = 0;
        int.....
很好~

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++)
        {