星星博客 »  > 

PTA1010 一元多项式求导

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

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

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

输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805313708867584

这个题目虽然简单,但是一开始做的时候,却发现测试点全都没有过,后来查询网上博客,虽然可以看得懂代码,但是却不是很明白为什么是这样写的,只好照猫画虎对自己的代码进行相应的修改,但是最后竟然比没有修改的时候通过测试点更少了。😭😭😭

后来,浏览其他的博客的时候,并且返回揣测题目的题意,原来题目的要求是这样的:
①我们在进行求导运算的时候,如果一开始系数的指数b就是0,那么这时候求导的结果是0,程序在这里就结束了。啥?为什么就程序结束了?我们重新回到题目,题目中说到以指数递降的方式输入多项式,并且我们观察输出样例,b = 0,并且不是第一项的时候,就直接结束了程序,没有输出数据。说明一旦遇到b为0的情况,我们要么是直接结束程序,要么是先输出0 0,然后才结束程序。而后者是零多项式的情况(也即是第一组数据中的b为0),才会先输出0 0,再结束程序
输出的数字之间要用空格间隔开。这时候我们有两种方案:
1、第一组数据的时候不许要再a的前面输出一个空格,其他组每一次输出,都需要再a的前面输出一个空格
2、在每一组b的后面输出一个空格,即printf("%d %d ",a,b)的形式,直到最后一组数据输出的时候,直接输出a,b,不在需要空格了。
显然,我们用第一种方案更加方便
③输出的时候,输出的是非零项的多项式,因为我们在输出之前需要判断a是否为0,如果为0,那么直接进行下一步操作,否则就先输出,然后才是进行下一步操作

#include<stdio.h>
int main(){
    int a,b,count = 1;
    while(scanf("%d%d",&a,&b) != EOF){
        if(b == 0 && count == 1){
            /*
            如果一开始输入的b就是0,并且是第一次输入,这时候就是一个零多项
            式,这时候我们直接输出0 0,然后结束程序
            */
            printf("0 0");
            break;
        }else if(b == 0)
        /*
        否则,如果一开始输入的b不是0,而是后面才输入0(说明不是零多项式),
        那么直接结束程序即可,有输出样例即可知道(因为它的以指数递降方式输
        入多项式),所以如果一开始输入的b不是0,而是后面输入0的,那么就说
        明这一项是最后一个多项式,所以可以结束程序了
        */
              break;
        a = a * b;
        b--;
        /*
        为了使不会有多余的空格,我们要么使在第一个输出的时候不要输出空
        格,其他的数字都需要在a的前面输出空格
        */
        if(count != 1) printf(" ");
        if(a != 0){
        /*
        由于题目要求的使输出非零项的系数和指数,那么这时候我们需要判断最
        求导之后a是否为0即可判断是否要输出
        */
            printf("%d %d",a,b);
        }
        count++;
    }
    return 0;
}

相关文章