POJ2527+多项式除法

模拟一遍即可。

注意一些特殊情况,见代码。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;

const int maxn = 10005;

struct Ploy{
    int cnt;//项的数目
    int coe[ maxn ];//各项系数
    int exp[ maxn ];//各项指数
}a;
struct Ploy2{
    int coe1,coe2;
    int exp1,exp2;
}b;
struct Ploy3{
    int coe,exp;
}tmp;

bool Judge( int aim ){
    //bool f = false;
    for( int i=a.cnt-1;i>=0;i-- ){
        if( a.coe[i]!=0&&a.exp[i]>=aim ){
            //f = true;
            return true ;
        }
    }
    return false;
}

void solve( int n,int k ){
    //ans.cnt = 0;
    while( 1 ){
        //if( Judge(k)==false ) break;
        int i;
        for( i=a.cnt-1;i>=0;i-- ){
            if( a.coe[i]!=0 ){
                tmp.coe = a.coe[i];
                tmp.exp = a.exp[i];
                break;
            }
        }
        if( tmp.exp<k ) break;
        int delta_exp = tmp.exp-k;
        int delta_coe = tmp.coe;//商
        b.exp1 = tmp.exp,b.coe1 = tmp.coe;
        b.exp2 = delta_exp,b.coe2 = delta_coe;
        //bool f1 = false,f2 = false;
        for( int i=0;i<a.cnt;i++ ){
            if( a.exp[i]==b.exp1 ){
                a.coe[i] -= b.coe1;
                //f1 = true;
            }
            if( a.exp[i]==b.exp2 ){
                a.coe[i] -= b.coe2;
                //f2 = true;
            }
        }
    }
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n,k;
    while( scanf("%d%d",&n,&k)==2 ){
        if( n==k&&k==-1 ) break;
        a.cnt = 0;
        for( int i=0;i<=n;i++ ){
            a.cnt ++;
            scanf("%d",&a.coe[i]);
            a.exp[i] = i;
        }
        if( k==0 ){
            puts("0");
            continue;
        }
        //printf("input\n");
        bool f = false;
        for( int i=0;i<a.cnt;i++ ){
            if( a.coe[i]!=0 ){
                f = true;
                break;
            }
        }
        if( f==false ) {
            puts("0");
            continue;
        }//多项式全为0
        if( k>n ){
            for( int i=0;i<a.cnt;i++ ){
                if( i==0 ) printf("%d",a.coe[i]);
                else printf(" %d",a.coe[i]);
            }
            printf("\n");
            continue;
        }//商为0
        //printf("solve\n");
        solve( n,k );
        f = false;
        for( int i=0;i<a.cnt;i++ ){
            if( a.coe[i]!=0 ){
                f = true;
                break;
            }
        }
        if( f==false ) {
            puts("0");
            continue;
        }//刚好整除
        int pos = a.cnt-1;
        for( int i=a.cnt-1;i>=0;i-- ){
            if( a.coe[i]!=0 ){
                pos = i;
                break;
            }
        }
        for( int i=0;i<=pos;i++ ){
            if( i==0 ) printf("%d",a.coe[i]);
            else {
                printf(" %d",a.coe[i]);
            }
        }
        printf("\n");
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值