(多项式运算4.7.6)POJ 2527 Polynomial Remains(多项式除法)

[编辑]

计算

\frac{x^3 - 12x^2 - 42}{x-3}.

把被除式、除式按某个字母作降幂排列,并把所缺的项用零补齐,写成以下这种形式:

\frac{x^3 - 12x^2 + 0x - 42}{x-3}.

然后商和余数可以这样计算:

  1. 将分子的第一项除以分母的最高次项(即次数最高的项,此处为x)。结果写在横线之上(x3 ÷ x = x2).
    \begin{matrix}x^2\\\qquad\qquad\quad x-3\overline{) x^3 - 12x^2 + 0x - 42}\end{matrix}
  2. 将分母乘以刚得到结果(最终商的第一项),乘积写在分子前两项之下(同类项对齐) (x2 · (x − 3) = x3 − 3x2).
    \begin{matrix}x^2\\\qquad\qquad\quad x-3\overline{) x^3 - 12x^2 + 0x - 42}\\\qquad\;\; x^3 - 3x^2\end{matrix}
  3. 从分子的相应项中减去刚得到的乘积(消去相等项,把不相等的项结合起来),结果写在下面。((x3 − 12x2) − (x3 − 3x2) = −12x2 + 3x2 = −9x2)然后,将分子的下一项“拿下来”。
    \begin{matrix}x^2\\\qquad\qquad\quad x-3\overline{) x^3 - 12x^2 + 0x - 42}\\\qquad\;\; \underline{x^3 - 3x^2}\\\qquad\qquad\qquad\quad\; -9x^2 + 0x\end{matrix}
  4. 把减得的差当作新的被除式,重复前三步(直到余式为零或余式的次数低于除式的次数时为止.被除式=除式×商式+余式 )
    \begin{matrix}\; x^2 - 9x\\\qquad\quad x-3\overline{) x^3 - 12x^2 + 0x - 42}\\\;\; \underline{\;\;x^3 - \;\;3x^2}\\\qquad\qquad\quad\; -9x^2 + 0x\\\qquad\qquad\quad\; \underline{-9x^2 + 27x}\\\qquad\qquad\qquad\qquad\qquad -27x - 42\end{matrix}
  5. 重复第四步。这次没什么可以“拿下来”了。
    \begin{matrix}\qquad\quad\;\, x^2 \; - 9x \quad - 27\\\qquad\quad x-3\overline{) x^3 - 12x^2 + 0x - 42}\\\;\; \underline{\;\;x^3 - \;\;3x^2}\\\qquad\qquad\quad\; -9x^2 + 0x\\\qquad\qquad\quad\; \underline{-9x^2 + 27x}\\\qquad\qquad\qquad\qquad\qquad -27x - 42\\\qquad\qquad\qquad\qquad\qquad \underline{-27x + 81}\\\qquad\qquad\qquad\qquad\qquad\qquad\;\; -123\end{matrix}

横线之上的多项式即为商,而剩下的 (−123) 就是余数。

\frac{x^3 - 12x^2 - 42}{x-3} = \underbrace{x^2 - 9x - 27}_{q(x)}  \underbrace{-\frac{123}{x-3}}_{r(x)/g(x)}

算数的长除法可以看做以上算法的一个特殊情形,即所有 x 被替换为10的情形。



/*
 * POJ_2527.cpp
 *
 *  Created on: 2013年10月26日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 10010;
int main(){
	int n,k;

	int val[maxn];
	while(scanf("%d%d",&n,&k)!=EOF,n!=-1 || k !=-1){
		int i;
		for(i = 0 ; i <= n ; ++i){
			scanf("%d",&val[i]);
		}

		//进行除法运算
		for(i = n ; i >= k ; --i){
			if(val[i] == 0){
				continue;
			}

			val[i-k] = val[i-k] - val[i];
			val[i] = 0;
		}

		//调整数组长度,即高位的0不用输出
		int t = n;
		while(val[t] == 0 && t > 0){
			--t;
		}

		for(i = 0 ; i < t ; ++i){
			printf("%d ",val[i]);
		}
		printf("%d\n",val[t]);


	}

	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值