思路:
1.开数组,范围是题目中的1000再多一点,用下标代表指数,其值代表系数;
2.while(…!=EOF),ctrl+z退出输出
3.从下标小到大去求导
4.记录系数不为0的次数
5.考虑特殊情况,次数为0,则直接输出“0 0”
6.不为0,输出系数与指数
注意点:
1.求导时,要从下标小的开始,因为如果从大的开始,下面的会用到其值(这里要使用原来的值,可此时已经改变了);所以从小的开始,下面不是会使用其值,而是改变其值,所以不影响。
求导后,要另原来的值系数为0,防止后续可能覆盖不成功!(虽然我不清楚为啥,因为已经初始化开辟的a数组为0了?)
2.根据系数不为0的次数,要另行判断,当次数为0时(即是一个零多项式),直接输出“0 0”
3.关于空格问题?
格式错误:if(i!=0) printf(" ");
只保证最后一个(物理数组的)不输出空格,但是导致了中间的会多输出;
cnt--; if(cnt!=0) printf(" ");
根据系数不为0的次数,来确定是否为最后一个(逻辑数组),是否输出。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[1010]={
};//存的是系数
int e,n;//e是指数,n是系数
while(scanf("%d%d",&n,&e)!=EOF){
a[e]=n;//以指数e为下标
}
int cnt=0;
//求导:从小到大,先确定后面用不到的
for(int i = 1; i <= 1000; i++){
a[i-1] = a[i]*i;//原来的系数a[i]*原来的指数i
a[i]=0;//(不能少)改变之后,要把之前的置为0,可能会防止不能覆盖
if(a[i-1]!=0){
cnt++;//记录系数不为0的个数
}
}
//另行判断
if(cnt==0){
printf("0 0");
}
else{
for(int i = 1000; i >=0; i--){
if(a[i]!=0){
printf("%d %d",a[i],i);
// if(i!=0) 格式错误:只防止了最后一个数没有多输出;会导致中间数多输出
// printf(" ");
cnt--;
if(cnt!=0) printf(" ");//只要不是最后一个,就都可以输出空格
}
}
}
return 0;
}