今天做到一道不错的题目,题目很简单,但是细节上的处理花费了我一些时间。首先看看题目:
意思就是按递降依次输入一个一元多项式的系数和指数,输入的系数不能为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');
}
发现错误没,就在那这里:
他写出当求导后的系数和指数都为0就输出 0 0.但实际上求导后系数变为0,这个时候指数必不可能为0。所以改为就好了。
这道题就是这样。 题目链接