PAT乙级1010

374 阅读3分钟

今天做到一道不错的题目,题目很简单,但是细节上的处理花费了我一些时间。首先看看题目:

image.png 意思就是按递降依次输入一个一元多项式的系数和指数,输入的系数不能为0(为0还有啥意义),然后你输出他求导后的系数和指数(求导怎么求都会),其实就是递降输入各组(m,n),最后输出m*n,n--.但是如果是“零多项式”,如果是在最后输入零多项式,那么就不输出(从样例得知),如果是第一组输入零多项式(第一组输出那么就只输入了一组哦,不毕竟降序),就输出0 0。当然还有一点是输出的最后一行后没有空格。那我们就需要对每一组判定,是不是零多项式,是不是最后一个输出。是不是零多项式就看指数是不是0;用一个FLAG判断是不是第一个输入的。代码如下:

//设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nx^n−1
#include <cstring>
#include <cstdio>
#include <iostream>

using namespace std;

int coe,exp;//系数和指数的缩写

//以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔
//如果指数为0,那么输出0 0(最后就不输出),如果
int main(){
    int flag = 0;//flag判断是否输出已经输出过,如果已经输出过(即不是第一次输出),那么要在本次输出前输出一个空格
    while(scanf("%d%d",&coe,&exp) != EOF){
        if(exp == 0){
            //指数为0的情况
            if(flag == 0) printf("0 0");//如果是第一次输出的,那么指数为0时输入 0 0 ,不然末尾直接不输出
        }
        else{
            if(flag++ == 0) printf("%d %d",coe*exp,exp - 1);//这是第一次输出,不用输出空格就好
            else printf(" %d %d",coe*exp,exp - 1);//已经输出过了,要中间有空格
        }
    }

    return 0;
}

这道题思路就是这样, 我的一个网友也做了这个题,他的代码出现了错误:

//设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nx^n−1
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n[50],m[50];
    int i=-1;
    int j=0;
    //输入数
    do
    {
        i++;
        scanf("%d %d",&n[i],&m[i]);
    }while(m[i]!=0);
    int sum=i; 
    for(i=0; i<=sum; i++)
    {
        n[i]=n[i]*m[i];
        m[i]--;
        if(!j&&n[i]!=0)//如果第一个输出且系数不为0
        {
            printf("%d %d",n[i],m[i]);
            j=1;
        }
        else if(!j&&n[i]==0&&m[i]==0)//第一个输出且为零多项式
        {
          j=1;
          printf("0 0");

        }
        else if(j&&n[i]!=0) //不是第一个输出且系数不为0
        {
            printf(" %d %d",n[i],m[i]);
        }
        else if(j&&n[i]==0&&m[i]==0)//第一个输出且为零多项式
        printf(" 0 0");
    }
  putchar('\n');
}

发现错误没,就在那这里:

image.png

他写出当求导后的系数和指数都为0就输出 0 0.但实际上求导后系数变为0,这个时候指数必不可能为0。所以改为就好了。

image.png

这道题就是这样。 题目链接