zeroday
V2EX  ›  问与答

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

  •  
  •   zeroday · Dec 27, 2014 · 2616 views
    This topic created in 4159 days ago, the information mentioned may be changed or developed.

    我的代码如下:

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

    Supplement 1  ·  Dec 27, 2014
    10 replies    2015-01-03 10:29:26 +08:00
    aaaa007cn
        1
    aaaa007cn  
       Dec 27, 2014
    while 的退出条件为 scanf 返回 EOF
    如果是通过重定向输入的话倒是没问题
    如果你直接运行的话
    是需要手动输入 EOF 的
    https://en.wikipedia.org/wiki/End-of-file
    windows ctrl+z
    linux ctrl+d
    zeroday
        2
    zeroday  
    OP
       Dec 28, 2014
    @aaaa007cn 哦,明白了。也就是说,PAT的检测系统是通过重定向的方式输入用例的。

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

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

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

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

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

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

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

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

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

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

    其实最近找这些题来做,是为了训练程序语言的控制结构的运用,培养用编程语言解决问题的逻辑思维。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3014 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 15:12 · PVG 23:12 · LAX 08:12 · JFK 11:12
    ♥ Do have faith in what you're doing.