PAT 的一道一元二次方程求导问题,实在想不出来用例 3 怎么一直错误。

2014-12-27 19:21:56 +08:00
 zeroday

我的代码如下:

#include <stdio.h>
int main()
{
    int base, exp;
    scanf ( "%d %d", &base, &exp );
    if ( exp == 0 )
    {
        printf ( "%d %d", 0, 0 );
    }
    else
    {
        printf ( "%d %d", base*exp, exp-1 );

        while ( exp - 1 != 0 )
        {
            scanf ( "%d %d", &base, &exp );
            printf ( " %d %d", base*exp, exp-1 );

        } 
    }

    return 0;
}

实在想不出来后,在网络AC的代码根据它的思路,自己改了一下,也AC了。

#include <stdio.h>

int main()
{
    int base, exp;
    int flag = 0;

    while ( scanf( "%d %d", &base, &exp ) != EOF )
    {
        if ( base*exp != 0 )
        {
            if ( flag != 0 )
            {
                printf (" ");
            }
            else
            {
                flag = 1;
            }
            printf ( "%d %d", base*exp, exp-1 );
        }
    }

    if ( flag == 0 )
    {
        printf ( "%d %d", 0, 0 );
    }

    return 0;
}

可是这段代码测试用例为 9 0 时无限循环,没出结果,这样也是对的吗?

2158 次点击
所在节点    问与答
10 条回复
aaaa007cn
2014-12-27 22:50:07 +08:00
while 的退出条件为 scanf 返回 EOF
如果是通过重定向输入的话倒是没问题
如果你直接运行的话
是需要手动输入 EOF 的
https://en.wikipedia.org/wiki/End-of-file
windows ctrl+z
linux ctrl+d
zeroday
2014-12-28 00:07:52 +08:00
@aaaa007cn 哦,明白了。也就是说,PAT的检测系统是通过重定向的方式输入用例的。

可是,我还是不明白我的第一次提交的代码,错在哪里。。。
aaaa007cn
2014-12-28 00:22:31 +08:00
while ( exp - 1 != 0 )
退出条件为 exp == 1
用例 3 是什么?
没有一次项么……
zeroday
2014-12-28 00:48:05 +08:00
@aaaa007cn 有一次项的。

用例3具体是什么也不知道。

我看题目的输出止于0,所以做一个判断,当求导后的指数为0时,输出0,然后停止循环。

不过看来,只有当EOF的时候,才能停止循环了。
aaaa007cn
2014-12-28 01:29:36 +08:00
不知道用例 3 具体是什么怎么能断定用例 3 有一次项的……
你可以用 exp > 1 来做退出判断的一部分
但是不应该用 exp - 1 != 0
另外 scanf 也要判断是不是读到 EOF
不然的话,比如输入只有 3 4 的话
你的那个代码就死循环了
zeroday
2014-12-28 02:15:52 +08:00
@aaaa007cn 我看错上面话的意思了。你说的没错,我的代码似乎没有一次项的时候,进入死循环。用例3应该没有一次项吧,可能还有负数指数项。

解决的办法是将循环条件为 scanf( "%d %d", &base, &exp ) != EOF 吗?

谢谢你的回答了。
aaaa007cn
2014-12-28 11:18:41 +08:00
如果考虑到负数的指数项
比如输入 1 0 1 -1
光改循环条件第一段代码还是要出错
改到最后好像又要变成第二段代码的样子
zeroday
2014-12-29 02:29:54 +08:00
@aaaa007cn 好像改不好了。请教一下,遇到这种情况是要重写吗?
aaaa007cn
2014-12-29 20:17:21 +08:00
改了之后再把相同代码块合并后
整个代码的结构就和你最终提交的那个差不多了
不知道你说的重写是指重写什么
但像这样根据测试结果来修改代码是很常见的

话说我没做过这种题
不理解它到底要考察什么
比如你说的要不要考虑负数指数
那其他的呢?空白输入?输入项总数为奇数个?
zeroday
2015-01-03 10:29:26 +08:00
@aaaa007cn 原来是这样。有时候写代码时思绪很乱,总喜欢推掉重写一个,一方面重新理清思路,一方面也是为了让代码看起来更美观。

根据猜测测试用例改了代码。这是按我第一次的代码进行修改,终于全部通过了。

附上代码,感觉有点乱,我还是先歇歇。

https://gist.github.com/arcticlion/f2ca9e98b7b629969187

其实最近找这些题来做,是为了训练程序语言的控制结构的运用,培养用编程语言解决问题的逻辑思维。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/157197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX