设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
解题思路:
用数组a[]来存放对应指数的系数,a[5]就是指数为5的系数。从低次到高次枚举,按照求导法则计算,统计不为0的个数。最后,从高到低枚举非零项的系数和指数。
PS:在牛客网A不过,发现指数还有可能为负,不过牛客网的这题很坑,各种bug。经测试,pat官网上指数都非负。因此在下面贴上牛客网二维数组的做法
//pat网版本
#include <cstdio>
int main() {
int a[1005] = {0};
int k, e, cnt = 0;
//读入多项式
while(scanf("%d %d", &k, &e) != EOF) {
a[e] = k;
}
//进行求导并统计非零项个数
for(int i = 1; i <= 1000; i++) {
a[i - 1] = a[i] * i;
a[i] = 0;
if(a[i - 1] != 0) cnt++;
}
//从高到底枚举输出非零项系数和指数
if(cnt == 0) printf("0 0"); //特例:木有非零项
else {
for(int i = 1000; i >= 0; i--) {
if(a[i] != 0) {
printf("%d %d", a[i], i);
cnt--;
if(cnt != 0) printf(" ");
}
}
}
return 0;
}
//牛客网版本
#include <cstdio>
int main(void){
int a[1005][2]={0}, cnt = 0;
//读入多项式,并统计个数
while(scanf("%d %d", &a[cnt][0], &a[cnt][1]) != EOF) {
cnt++;
}
for(int i = 0; i < cnt; i++){
if(a[i][1] != 0) printf("%d %d", a[i][0] * a[i][1], a[i][1] - 1); //打印求导后的多项式
if((i != cnt - 1) && (a[i+1][1] != 0)) printf(" "); //输出空格
if(cnt == 1 && a[i][1]==0) printf("0 0"); //指数和系数都是0,表示为0 0
}
return 0;
}