| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9337 人关注过本帖
标题:求为什么会output limit exceeded
只看楼主 加入收藏
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
结帖率:56.25%
收藏
已结贴  问题点数:5 回复次数:11 
求为什么会output limit exceeded
给出年月日,计算改日是该年第几天
#include<stdio.h>//求某个日期在一年中是第几天 172
int sum(int month, int day)
{
    int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    for (int i = 1;i < month;i++)
        day += a[i];
    return day;
}
int main()
{
    int year, month, day, sum1 = 0,leap=0;
    while (1)
    {
        scanf("%d-%d-%d", &year, &month, &day);
        if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)leap = 1;
        sum1 = sum(month, day);
        if (leap==1&&month>2)printf("%d\n", sum1 + 1);
        else printf("%d\n", sum1);
    }
    return 0;
}
结果是output limit exceeded,为什么?
搜索更多相关主题的帖子: 年月日 
2016-01-26 22:36
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
因为你的程序就是个死循环

重剑无锋,大巧不工
2016-01-26 22:56
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 2楼 beyondyf
因为题目说输入多组数据,但又没说什么时候输入结束,不是这样处理吗?

计算机专业的大学生
2016-01-26 23:01
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不是

重剑无锋,大巧不工
2016-01-26 23:02
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 4楼 beyondyf
我改成这样了怎么还是同样的问题?
#include<stdio.h>
int sum(int month, int day)
{
    int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    for (int i = 1;i < month;i++)
        day += a[i];
    return day;
}
int main()
{
    int year, month, day, sum1 = 0,leap=0;
    char a, b, c, d;
    while(scanf("%d-%c%c-%c%c", &year, &a,&b, &c,&d))
    {
        month =(a-'0') * 10 + b-'0';
        day = (c-'0') * 10 + d-'0';
        if (month >= 13||day>31||year<999||year>9999)break;
        if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)leap = 1;
        sum1 = sum(month, day);
        if (leap==1&&month>2)printf("%d\n", sum1 + 1);
        else printf("%d\n", sum1);
    }
    return 0;
}

计算机专业的大学生
2016-01-26 23:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
因为你还没改对

姑娘别闹了,问oj类问题至少该把原题描述发上来吧。光发你的出错代码除了帮你改改语法毛病还能干什么?

顺带告诉你,你这还是死循环。原因请查阅scanf的返回值。

acm是种很严谨的游戏,没耐性就别玩了。虐心。


重剑无锋,大巧不工
2016-01-26 23:32
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 6楼 beyondyf
虐心也要继续玩,虐死为止
题目:
Description
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY-MM-DD组成,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
Original Transformed

2000-01-01
2000-01-01[EOL] [EOF]

Sample Output
Original Transformed

1

计算机专业的大学生
2016-01-27 12:00
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
嗯,虽然对你的交流方式表示不满意,不过对你这份执拗表示欣赏。

今天有点时间,说声谢谢下午给你细细分析分析这道题,借此或能达到点触类旁通的效果。另外,发问题时除附上原题描述最好将题目出处也附上,方便别人实际去测试。

重剑无锋,大巧不工
2016-01-27 12:26
rainnese
Rank: 1
来 自:广州
等 级:新手上路
帖 子:51
专家分:0
注 册:2016-1-15
收藏
得分:0 
回复 8楼 beyondyf
很抱歉啊!
谢谢!下次会注意的

计算机专业的大学生
2016-01-27 13:48
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
好吧,那就以你的第一段价码来说说这道题吧。第二段代码里加了好多画蛇添足的东西,而本质问题并没有改变。

根据日期计算是该年的第几天。你的算法虽然有待改进的地方,但没错。而主要问题出在数据的读取上。题目说有多组测试数据,但多组不是无限组,总有个完啊。你要做的是判断什么时候没数据了就结束你的程序。

这里可以用(也是ACMER常用的)scanf的返回值来判断数据是否读完。

当scanf读取成功时返回读取到的参数数量,否则返回EOF。EOF是一个宏,定义在stdio.h里,值为-1。

以你的代码为例,正确的判断方式有:

scanf("%d-%d-%d", &year, &month, &day) != EOF

scanf("%d-%d-%d", &year, &month, &day) == 3



~scanf("%d-%d-%d", &year, &month, &day)

最后这个是利用了EOF等于-1这一特征,写起来短一点。效果等同于第一个。

所以,对于你的代码,只需要把上述任一表达式放在你的while判断中即可。想在循环体中判断也可以,但要注意两个不同位置的逻辑是反的。

就这么简单,这些东西在大多数OJ的FAQ里都有介绍,你若看过就不会被它纠结了。

顺便说说你的算法吧。思想上没错,但实现的不好,凌乱。

按月加日子单独写了一个函数,判断闰年却放在了主函数里。都是算法的一部分为什么不放在一起。还有那个函数。数组的0元素舍弃用于占位可以减少偏移量的计算,这个做法很好。不过既然你想到了将每个月的天数保存在数组里,为什么不把每个月之前的累计天数也保存成数组呢?这样是不连那个循环也省去了?

写一个示例给你。
程序代码:
#include<stdio.h>

int cal(int year, int month, int day)
{
    const int c[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    return c[month] + day + ((year % 4 == 0 && year % 100 || year % 400 == 0) && month > 2);
}

int main()
{
    int y, m, d;
    for(; scanf("%d-%d-%d", &y, &m, &d) != EOF; printf("%d\n", cal(y, m, d)));
    return 0;
}

重剑无锋,大巧不工
2016-01-27 15:36
快速回复:求为什么会output limit exceeded
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017426 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved