(PTA乙级C语言) 1010 一元多项式求导——记得试试0,注意陷阱

11 篇文章 0 订阅

1010 一元多项式求导 (25 分)

设计函数求一元多项式的导数。(注:x​^n​​(n为整数)的一阶导数为n*x^​(n−1​​)。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

我的思路:

首先,存入数组,然后分奇数偶数下标:0,2,4,6.。。。。为次方,下标1,3,5,7.。。。为系数。

输入:直接创建一个大数组(空间浪费就浪费吧),然后循环输入,直到最后输入0结束,记一下长度len

处理:偶数下标的是系数,乘以之后的幂数;奇数下标的是幂数,直接减1;

输出:最后的两个(常数项求导为0)不输出,所以说len-2,又因为最后一个后面不带空格所以说单独输出(循环输出为len-3)


第一次代码: 

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int a[100],b[100];
    int len = 0,i=0;

    for(i=0; i<100; i++)
    {
        scanf("%d",&a[i]);
        if(i %2 == 1 && a[i] == 0)
            break;
    }
    len = i+1;
    for(i=0; i<len; i++)
    {
       
        if(i % 2 == 0)
            b[i] = a[i] * a[i+1];
        else
            b[i] = a[i] - 1;
    }


        for(i=0; i<len-3; i++)
            printf("%d ",b[i]);
        printf("%d",b[i]);

    
    return 0;
}

提交,错误,只有15分

 

感谢大佬博客:https://blog.csdn.net/qq_40840749/article/details/82178465

错误原因:

1、  要注意的是,如果一开始输入的就只有一个项数为0的常数,求导后应该输出0 0。记得区分出这种情况的输出。所以在求导过程中,先判断项数是否为0,若不为0才对该项进行求导计算。

2、这题比较难的是:在未知输入数据个数时,“如何结束循环”。一开始是想用项数=0来结束循环的,后来发现有可能不存在该项那么循环将无法结束,又想到了用getchar来接收字符——一开始想的是用do...while形式,只要字符不等于'\n'就继续循环,但发现并行不通(我也想不清楚为什么QAQ),于是换了一种方式:选择while(1),但在循环中判断输入的字符是否为'\n',如果是则跳出循环,这在通过了所有测试用例。

 


针对第一点,添加 len==2 的判断,然后对应输出“0 0”,因为常数项怎么求都是0啦

//最后的输出部分
if(len == 2)
    printf("0 0");

!!!  否定,如果len==2,然后输入为2 1,这样输出结果应该是2 0,看来pta的测试用例没有这一个。。。

修改:

 if(len == 2)
        printf("%d %d",b[0],b[1]);

改完又错了,上面那个处理有问题,如果输入0 0 的话那么会是 0 -1 而不是 0 0

所以说再改:

//处理部分
for(i=0; i<len; i++)
{
        //强行手动硬杠
        if(len == 2 && a[1]==0)
        {
            b[0] = 0;
            b[1] = 0;
            break;
        }

        if(i % 2 == 0)
            b[i] = a[i] * a[i+1];
        else
            b[i] = a[i] - 1;
}

 

针对第二点:修改循环输入的结束条件

                      参照大佬的思路,使用getchar接收 '\n' 回车结束循环;


最终代码: 

#include <stdio.h>
#include <stdlib.h>


int main()
{
    int a[100],b[100];
    int len = 0,i=0;
    
    //输入部分
    for(i=0; i<100; i++)
    {
        scanf("%d",&a[i]);
        //这样写还真行啊
        if(getchar() == '\n')
            break;
    }

    len = i+1;    //记录长度

    //处理部分
    for(i=0; i<len; i++)
    {
        if(len == 2 && a[1]==0)
        {
            b[0] = 0;
            b[1] = 0;
            break;
        }

        if(i % 2 == 0)
            b[i] = a[i] * a[i+1];
        else
            b[i] = a[i] - 1;
    }

    //输出部分,三种情况,输入两个、最后不是0、和正常的(题目给的那种)
    if(len == 2)
        printf("%d %d",b[0],b[1]);
    else if(a[len-1]!=0)
    {
        for(i=0; i<len-1; i++)
            printf("%d ",b[i]);
        printf("%d",b[i]);
    }
    else
    {
        for(i=0; i<len-3; i++)
            printf("%d ",b[i]);
        printf("%d",b[i]);
    }

    return 0;
}

总结:自己的毛病一堆一堆的。。。PTA也真是的不给说测试用例用的啥让我知道哪错了也行啊==

PS:第一次写CSDN博客唉不知道自己能坚持多少PTA能刷多少到底是不是浪费时间呢啊难受啊慢慢写吧已经语无伦次了啊这还少处女作虽然说借鉴大佬博客吧是但是写博客还是挺有逼格的哈哈哈就这样吧也不知道有没有人看如果看到还真是有点不好意思呢poi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值