一、题目详情
问题描述:一元多项式求导
设计函数求一元多项式的导数。(注:(n为整数)的一阶导数为n
。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0
。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
二、题目解析
代码:
#include<stdio.h>
#include<string.h>
int main()
{
/*
* co[100]:存储原多项式非零项系数(偶数位)和指数(奇数位)
* in[100]:存储求导后所得多项式的系数(偶数位)和指数(奇数位)
* count:存储系数的个数
* in_pos:求导后存储系数和指数至数组后下标的位置
* i:循环变量
*/
int co[100],in[100];
int count = 0;
int in_pos = 0;
int i;
//通过键盘读取多项式非零项系数和指数
while(scanf("%d",&co[count++]) != EOF);
count--;
//求导
for(i=0;i<count;i++)
{
if(i%2==0)//i为偶数时,计算求导后的系数并赋值给b[i]
in[i] = co[i] * co[i+1];
else//i为奇数时,计算求导后的指数并赋值给b[i]
in[i] = co[i]-1;
in_pos = i;
}
//特判零次项
if(in_pos==1 && in[0] == 0)
{
printf("0 0\n");
return 0;
}
//输出控制
for(i=0;i<=in_pos;i++)
{
if(i%2==0 && in[i]==0)//系数为0时
break;
if(i==0)//输出第一个数
printf("%d", in[i]);
else//输出其他数(系数和指数),前置一个空格
printf(" %d", in[i]);
}
return 0;
}
提交结果(分数/满分):
25/25
提示:
1. 通过键盘获取多项式系数与指数
while(scanf("%d",&co[count++]) != EOF);
在 PTA 教学平台上运行可以得到如期的数据,但在 Visual C++ 6.0 平台上,该行代码不能通过 EOF 获得所需数据,读者应加以改进。
2. 求导过程
for(i=0;i<count;i++)
{
if(i%2==0)//i为偶数时,计算求导后的系数并赋值给b[i]
in[i] = co[i] * co[i+1];
else//i为奇数时,计算求导后的指数并赋值给b[i]
in[i] = co[i]-1;
in_pos = i;
}
3. 零多项式
若输入样例1为:
1 1
则输出样例1为:
1 0
也就是说,原多项式为 x,则求导后为 1,求导结果正确。
若输入样例2为:
1 0
则输出样例2为:
0 0
也就是说,原多项式为 1,则求导后为 0,求导结果正确,按照题意,输出 0 0。