设计函数求一元多项式的导数。(注: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
实现思路:
1.考虑到题目并未给定界定输入结束的方式,即多项式的最后一项指数不确定(不一定为0),故采用gets或者fgets这种以回车结尾的输入方式最为稳妥,但这样的话,就会涉及到字符串数组和整数数组的转化问题,较为繁琐,故推测题目给定的潜在结尾方式为末尾为0,经测试确实如此。
2.定义足够长的数组,循环读入数据,以输入为0作为结束标记(即考虑直接输入0的情况,但会产生对于6 5 0 0这种测试数据的最后一位0丢失)。
3.考虑零多项式的情况输出,否则则正常输出,但需判定空格符条件
代码如下:
#include<stdio.h>
int main()
{
int iNum[1000];
int i=-1;
//输入数据
do
{
i++;
scanf("%d",&iNum[i]);
}while(!iNum[i]==0);
//判定零多项式
if(iNum[0]==0||iNum[1]==0)
{
printf("0 0");
}
//正常输出
else
{
for(int j=1;j<=i-1;j=j+2)
{
printf("%d %d",iNum[j-1]*iNum[j],iNum[j]-1);
if(j<i-2)
{
printf(" ");
}
}
}
return 0;
}
错误分析:其中空格条件控制的j<i-2,起初写为j!=i-2,则测试点2格式错误,反思格式错误基本出于空格符,遂考虑当输入数据出现最后两位是0的情况时,最后一位丢失,则i最后一位为系数位,j需要到i-1,那么在最后一项后就会多一个空格。修改后通过。
扩展思路:偶然看到其他网友的另外一种思路,引以为参考,即不定义数组,每输入一组数据两个整数即分析判别输出,直到输入错误,即scanf函数出现EOF错误,但我个人测试直接输入一个0或者输入x和0(x为任意非0整数),则程序错误无法进行,故输入控制还需再考虑,思路可借鉴。