V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeroday
V2EX  ›  问与答

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

  •  
  •   zeroday · 2014-12-27 19:21:56 +08:00 · 2215 次点击
    这是一个创建于 3614 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的代码如下:

    #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 时无限循环,没出结果,这样也是对的吗?

    第 1 条附言  ·  2014-12-27 20:53:57 +08:00
    10 条回复    2015-01-03 10:29:26 +08:00
    aaaa007cn
        1
    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
        2
    zeroday  
    OP
       2014-12-28 00:07:52 +08:00
    @aaaa007cn 哦,明白了。也就是说,PAT的检测系统是通过重定向的方式输入用例的。

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

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

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

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

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

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

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

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

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

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

    其实最近找这些题来做,是为了训练程序语言的控制结构的运用,培养用编程语言解决问题的逻辑思维。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1141 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:56 · PVG 02:56 · LAX 10:56 · JFK 13:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.