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

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[n]==0&&n>=0){
            n--;
        }
        for(int i=0;i<n;i++){
            cout<<a[i]<<" ";
        }
        cout<<a[n]<<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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值