题目链接在此。
题意理解
此题是完全的简单模拟,只需要实现求导公式,注意输出格式即可。
我的方法和《算法笔记》中的方法对比:
我的用a[]数组保存输入数据,然后将求导后的结果存入b[]数组,最后在输出的时候加以输出控制。刚开始第一次提交代码时通过两个测试点,一个格式错误,两个答案错误。后来发现样例没过去,其实只要在输出时做一个判断即可(因为出现在样例的这种错误是由于对常数项求导,使之成为了-1项并输出了,故只需进行判断之后,不输出即可);第二次提交时两个格式错误,其他测试点都过了,其实还是在于样例这种类型,继续在输出时进行判断即可。所以说我的方法在输出格式判断上反而是花了更多时间的。
算法笔记中的方法是用数组a[i]表示指数为i的项的系数,则a[0]=0(零次项的系数为0),然后求导的过程中更新数组a[],之后再遍历数组,从指数从高到低输出,加以输出格式控制即可。还需要注意,每次a[i]都要清零,比如这种情况f(x) = x^5+x^3+x,若不清零,则a[3]就仍然存在,故结果会出错。
AC代码
此处指给出我自己的代码。
#include<stdio.h>
#include<string.h>
int main(){
int a[10000],b[10000];
int cnt = 0;
int bindex = 0;
while(scanf("%d",&a[cnt++]) != EOF);
cnt--;
//求导公式
for(int i = 0 ; i < cnt; i++){
if(i%2 == 0){
b[i] = a[i]*a[i+1];
} else{
b[i] = a[i]-1;
}
bindex = i;
}
//特判零次项
if(bindex==1 && b[0] == 0){
printf("0 0\n");
return 0;
}
//输出控制
for(int i = 0 ; i <= bindex; i++ ){
if(i%2 == 0 && b[i] == 0) {
break;
}
if(i==0){
printf("%d",b[i]);
}else{
printf(" %d",b[i]);
}
}
printf("\n");
return 0;
}