多项式除法取余。
也可模拟。
输入:多个测试样例,每个样例第一行是n、k(0~10000),
第二行n+1个整数给出a(x)的系数,以a0开始,an结束。
n = k = -1时输入结束。
输出:对每个测试样例输出余数的系数。
从常量系数r0开始。若余数是0,则输出常量系数0;否则若余数是d次的,就要输出d + 1个系数,之间用空格隔开。
思路:
多项式各项系数存储在数组中,之后不断按一下方法除 ( x^k + 1)——除数:
若n >= k,则当前余数对应多项式不小于除数,需要进行一次除法;
商的当前项为an * x ^ (n - k),使余数数组中a[n] = 0, a[n - k] = a[n - k] - a[n];然后调整a数组长度——(while( n >= 0 && !a[n]) n--);
依此类推,直到n < k为止。此时如果n < 0,则被除数恰被除尽;否则a数组中是余数多项式中各项系数。
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 10010;
int main(){
int n, k, val[N];
while(cin>>n>>k && n != -1 || k != -1){
for(int i = 0; i <= n; i++)
scanf("%d", &val[i]);
//division
for(int i = n; i >= k; i--){
if(val[i] == 0)
continue;
val[i - k] = val[i - k] - val[i];
val[i] = 0;
}
//adjust length of array, 高位0不输出
int tmp = n;
while(val[tmp] == 0 && tmp > 0)
tmp--;
for(int i = 0; i < tmp; i++)
printf("%d ", val[i]);
printf("%d\n", val[tmp]);
}
return 0;
}