2-7 一元多项式求导 (20分)
设计函数求一元多项式的导数。
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
刚开始的时候,本能的第一反应就是用链表来写。 可是在执行的过程中发现了好多困难,结果就是下面那样子了。【哈哈,后来我改对了,但是时隔好久了】
之后吧,还是向实力低头了,用数组来写吧。最下面有正确答案。
首先啊,我用C语言来写的时候,不知道怎么来判断输入什么时候可以截止。 第二,多项式求导的时候,如果出现了一个只有常数项的东西,该项求导之后系数和指数全部为0,到底是输出0 0,还是什么也不输出啊? 事实证明,输出0 0 不急,后来借鉴之后,发现C++的代码好多人在用,不使用链表很简单,代码简洁,道理自己懂就行。
C++代码:
总结了好多答案,可以使用了。 我这真难啊,鼓捣了好几天才写完。 注意:当输入只有常数项,比如5 0 的时候,求导之后就什么都没有了,我闷习惯的认为就是0,但是这里要输出0 0。 记住吧,孩子!
#include <iostream>
using namespace std
;
int main()
{
int x
,y
;
int flag
=0;
while(scanf("%d %d",&x
,&y
)==2&&y
!=0)
{
if(flag
++)
cout
<<" ";
cout
<<x
*y
<<" "<<y
-1;
}
if(!flag
)
cout
<<"0 0";
return 0;
}
链表【已更正】
这个是我在后来复习的时候改正的,但是这个题目集已经结束了,我把一些极端的数据都测试了一下,没什么问题了,但是我又不是PTA,如果有人碰到一样的题目,可以帮我把这个答案测试一下吗?顺便告诉我结果哦。 谢谢喽!
#include <stdio.h>
#include <stdlib.h>
typedef struct SNode
{
int m
;
int n
;
struct SNode
*Next
;
} Node
,*List
;
List
CreatList();
void PrintList(List L
);
List
operate(List L
);
int main() {
List L
;
L
=CreatList();
L
=operate(L
);
PrintList(L
);
return 0;
}
List
CreatList() {
List L
;
Node
*p
,*s
;
int x
,y
;
L
=(List
)malloc(sizeof(Node
));
L
->Next
=NULL;
s
=L
;
while(scanf("%d %d",&x
,&y
)==2&&y
!=0) {
p
=(List
)malloc(sizeof(Node
));
p
->m
=x
;
p
->n
=y
;
s
->Next
=p
;
s
=p
;
}
s
->Next
=NULL;
return L
;
}
void PrintList(List L
) {
Node
*p
;
p
=L
->Next
;
if(p
==NULL)
printf("0 0");
int cnt
=0;
while(p
) {
if(cnt
++)
printf(" ");
printf("%d %d",p
->m
,p
->n
);
p
=p
->Next
;
}
}
List
operate(List L
) {
Node
*p
;
p
=L
->Next
;
while(p
) {
if(p
->n
==0) {
p
->m
=0;
} else {
p
->m
=p
->m
*p
->n
;
p
->n
--;
}
p
=p
->Next
;
}
return L
;
}
数组【已更正】:
#include <stdio.h>
#include <stdlib.h>
int main() {
int x
,y
;
int cnt
=0;
while(scanf("%d %d",&x
,&y
)==2) {
if(y
==0&&cnt
==0)
printf("0 0");
if(y
==0)
break;
if(cnt
++)
printf(" ");
printf("%d %d",x
*y
,y
-1);
}
return 0;
}