// B1010 一元多项式求导.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
考察:1、一元多项式求导——以数组来做
编程思想:(注意边界)
1、用数组存取,下标是指数?下标上的上的位置为系数
2、求导就是,系数 * 下标 放在 i--,即 a [i - 1] = a[i] * i ,
3、逆着来还是顺着来,顺着来了从 i = 1放到i = 0上,从低到高,不会覆盖掉
4、边界条件,0 0
learn && wrong:
1、如何求导——求导就是,系数 * 下标 放在 i--,即 a [i - 1] = a[i] * i ,
2、如果我没有x的0次,那我如何终止循环呢?while ...EOF比较好,对,不一定以0为结尾!不一定以常数为结尾!
3、注释不好,放旁边不要上面
4、然后还有,a[i]上如何处理,其实是输出错了,是a[i - 1],输出还要i - 1的,而且a[i]要置为0
5、再次强调,认真调试比瞎猜原因快!
6、数组经常越界
7、从低到高覆盖,从高到低输出
#include <iostream>
using namespace std;
const int num = 1010;
//array放到main外面就提示不明确,放到main里面就没有提示,而且,纠正了之前的一点,就是数组下标可以是变量的
int main()
{
int array[num] = { 0 };//下标i为指数,a[i]为系数,指数不超过1000,即下标不超过1000
int xishu, zhishu ;
int size = 0;
while (scanf_s("%d %d", &xishu, &zhishu), zhishu != 0) {
array[zhishu] = xishu;
size++;
}
for (int i = 1;i < num;i++) { //如何求导呢,遍历数组,如果数组数字不为0,则a[i] * i放到a[i-1]上去,但是array[i]要处理掉,而且新的开始也要处理输出 //这里错了,不是size,而且,好像是从高位往低位输出
if (array[i] != 0) {
array[i - 1] = array[i] * i;
array[i] = 0; //直接为0是对的
}
}
if (size == 0) printf("0 0");
else {
for (int i = num - 1;i >= 0;i--) { 1、求导是对的,但前面有个很大的数字,越界了,i不是num,而是num - 1;2、从高到低输出
if (i > 0 && array[i] != 0)
printf("%d %d ", array[i], i);
else if(i == 0 && array[i] != 0) printf("%d %d", array[0], i); //else if如果写成else,也是错的,一堆0
}
}
return 0;
}