您的位置:首页 > 其它

POJ2527 简化 · 多项式相除求余数

2016-11-14 16:22 204 查看
1 题意

2 分析

注意如果得到的余数和除数幂次相同也要继续除,知道余数的幂小于除数或者余数为0(整除)!

注意题目输入和输出都是从低次幂开始的!

代码一针对此题,代码二按部就班。

3

代码一
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>

using namespace std;
const int maxn=1e4+10;
int a[maxn],h[maxn];// 多项式a/多项式b
int main()
{
//freopen("out.txt","w",stdout);
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==-1&&k==-1) break;
for(int i=0;i<=n;i++)
a[i]=0;
for(int i=0;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n;i>=k;i--){
if(a[i]!=0){
a[i-k]-=(a[i]);
a[i]=0;
}
}
while(a
==0&&n>=0){
n--;
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<a
<<endl;
}
return 0;
}

代码二

//假设多项式每次相除得到的商总是整数,对于此题肯定符合
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>

using namespace std;
const int maxn=1e4+10;
int a[maxn],h[maxn];//  多项式a/多项式b
int Compare(int la,int lh){
if(la>=lh)   return 1;
else if(la<lh)  return 0;
}
int main()
{
//freopen("out.txt","w",stdout);
int n,k;
while(~scanf("%d%d",&n,&k)){
if(n==-1&&k==-1)    break;
int la=-1,lh=k;
for(int i=0;i<=n;i++)
a[i]=h[i]=0;
h[k]=1;h[0]=1;//题目条件
for(int i=0;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=n;i>=0;i--){
if(la==-1&&a[i]!=0){
la=i;
break;
}
}

while(Compare(la,lh)>0){///余数和除数最高次幂相同时要继续除,直到余数幂小于除数或者余数为0
int d=la-lh;//商的幂
int s=a[la]/h[lh];//商的系数
for(int i=0;i<=lh;i++){
a[i+d]-=(s*h[i]);
}
for(int i=la;i>0;i--){//la最低到1
if(a[i]==0) la--;
else break;
}
if(la==0&&a[0]==0){
break;
}
}
for(int i=0;i<la;i++){
cout<<a[i]<<" ";
}
cout<<a[la]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: