| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1809 人关注过本帖
标题:2个一元多项式求积(大家来看看,如何优化)
只看楼主 加入收藏
zglcx123
Rank: 2
等 级:论坛游民
帖 子:60
专家分:10
注 册:2007-7-2
收藏
 问题点数:0 回复次数:2 
2个一元多项式求积(大家来看看,如何优化)
/* [bo][it]题目-要求[/it][/bo]
[bo][un]Description[/un][/bo]
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求积,并输出求积的结果。
[bo][un]Input[/un][/bo]
输入为两个一元多项式, 每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。
系数和指数均为整数,指数不小于0。
[bo][un]Output[/un][/bo]
输出为求积结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。
系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
[bo][un]Sample Input[/un][/bo]
2 5 1 0 -1 -1
5 4 3 0 -1 -1
[bo][un]Sample Output[/un][/bo]
10 9 6 5 5 4 3 0
*/
程序代码:
#include<stdio.h>
typedef struct multi{
    int a;
    int b;
    struct multi *next;
}*mult;

mult Init(){//初始化 
    mult L;
    L = new multi;
    return L;
}

mult Input(mult L){//接收输入数据 
    int ia;
    int ib;
    mult p = L;
    
    while(1){
        scanf("%i %i", &ia, &ib);
        if(ia == -1 && ib == -1){
            break;
        }else if(ia == 0){
            continue;
        }else{
            p->next = new multi;
            
            p->next->a = ia;
            p->next->b = ib;
            p = p->next;            
        }
    }
    return L;
}

mult Deal(mult L1, mult L2){//处理 ,把结果保存在新建的L3里 
    mult p1 = L1;
    mult p2 = L2;
    mult L3 = Init();
    mult p3 = L3;
    int n = 0;//记录有效结点数 
    while(p1->next != NULL){//2个多项式相乘 
        while(p2->next != NULL){
            p3->next = new multi;
            p3->next->a = p1->next->a * p2->next->a;
            p3->next->b = p1->next->b + p2->next->b;
            n++;
            p2 = p2->next;
            p3 = p3->next;
        }
        p2 = L2;
        p1 = p1->next;
    }

    
//    p3 = L3;
//    while(p3->next != NULL){//???***
//        printf("%i %i ", p3->next->a, p3->next->b);
//        p3 = p3->next;
//    }
//    printf("\nn = %i\n", n);
    
    p3 = L3;    
    int tempa;
    int tempb;
    for(int i = 1; i < n; i++){//排序 递减 
        for(int j = 1; j <= n-i; j++){
            if(p3->next->b < p3->next->next->b){//前小后大,就交换数据 
                tempa = p3->next->a;
                tempb = p3->next->b;
                p3->next->a = p3->next->next->a;
                p3->next->b = p3->next->next->b;
                p3->next->next->a = tempa;
                p3->next->next->b = tempb;
//            }else if(p3->next->b == p3->next->next->b){
                
            }
            p3 = p3->next;                
        }
        p3 = L3;
    }
    
    mult k;
    p3 = L3; 
    while(p3->next != NULL && p3->next->next != NULL){//对指数相同的结点 合并 删除前结点  
        if(p3->next->b == p3->next->next->b){
            p3->next->next->a += p3->next->a;
            k = p3->next;
            p3->next = k->next;
            k->next = NULL;
        }else{
            p3 = p3->next;
        }
    }
    
    p3 = L3;

    while(p3->next != NULL){//对系数是0的结点删除 
        if(p3->next->a == 0){
            k = p3->next;
            p3->next = k->next;
            k->next = NULL;
        }else{
            p3 = p3->next;
        }
    }
    return L3;
    
}

void Output(mult L){//输出 
    mult p = L;
    if(p->next == NULL){
        printf("0\n");
        return;
    }
    while(p->next != NULL){
        printf("%i %i ", p->next->a, p->next->b);
        p = p->next;        
    }
    printf("\n");
    return;
}

int main(){
    mult Init();//初始化 
    mult Input(mult L);//输入 
    mult Deal(mult L1, mult L2);//处理 
    void Output(mult L);//输出 
    
    mult L1;
    L1 = Init();
    L1 = Input(L1);    
    mult L2;
    L2 = Init();
    L2 = Input(L2);
    
    L1 = Deal(L1, L2);
    Output(L1);
    
    getchar();//
    getchar();//为什么这里要有2个getchar才能显示,使命令提示符不一闪而过
    return 1;
}



//用Dev-cpp通过,可用,但太耗时间了,大家看看如何优化

//主要看如何优化,
搜索更多相关主题的帖子: 多项式 
2008-10-15 20:43
zglcx123
Rank: 2
等 级:论坛游民
帖 子:60
专家分:10
注 册:2007-7-2
收藏
得分:0 
大家看下,如何优化,减少运行时间
2008-10-17 18:31
onlygxj
Rank: 1
来 自:广西大学
等 级:新手上路
帖 子:24
专家分:0
注 册:2008-10-18
收藏
得分:0 
最近在写一元多项式相加都非常吃力,这个不会
2008-10-18 01:41
快速回复:2个一元多项式求积(大家来看看,如何优化)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025265 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved