| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 921 人关注过本帖
标题:求一个快速的计算多项式幂的算法
取消只看楼主 加入收藏
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
求一个快速的计算多项式幂的算法
随机输入一个多项式和一个指数,然后求多项式的幂,用链表实现
我在求多项式的积时总是要新建一个链表用于存放结果,然后再释放原来的链表,这样如果指数太大,程序就变得很慢,有没有比较快的算法呢?
搜索更多相关主题的帖子: 指数 多项式 新建 
2013-04-08 16:21
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
程序代码:
/****************************    list.h       ***************************************************************************************/
typedef double ElementDouble ;
typedef int    ElementInt ;

struct Node ;
typedef struct Node *Position ;
typedef Position List ;

List CreatList ( void ) ;

int IsEmpty ( List L ) ;

void MakeEmpty ( List L ) ;

void Insert ( ElementDouble D, ElementInt Index, List L ) ;

void Print ( List L ) ;

void DisposeList ( List L ) ;



struct Node {
    ElementDouble D ;

    ElementInt    Index ;
    struct Node * Next ;
} ;




/**************************   list.c    ***************************************************/

#include "list.h"
#include <stdio.h>
#include <stdlib.h>
List
CreatList ( void )
{
    List L ;
    L = malloc ( sizeof ( struct Node ) ) ;
    if ( NULL == L )
    {
        fprintf ( stderr, "CreatList :Out of space.\n" ) ;
        exit ( 1 ) ;
    }
    MakeEmpty ( L ) ;
    return L ;
}
int
IsEmpty ( List L )
{
    return NULL == L -> Next ;
}
void
MakeEmpty ( List L )
{
    if ( L != NULL )
    {
        Position p, q ;
        p = L -> Next ;
        while ( p != NULL )
        {
            q = p -> Next ;
            free ( p ) ;
            p = q ;
        }
        L -> Next = NULL ;
    }
}
void
Insert ( ElementDouble D, ElementInt Index, List L )
{
    Position p, q ;
    q = L ;
    if ( 0 == D )
        return ;
    while ( q -> Next != NULL && q -> Next -> Index > Index )
        q = q -> Next ;
  
    if ( q -> Next != NULL && q -> Next -> Index == Index )
        q -> Next -> D += D ; 
    else
    {
        p = malloc ( sizeof ( struct Node ) ) ;
        if ( NULL == p )
        {
            fprintf ( stderr, "Insert :Out of space.\n" ) ;
            exit ( 2 ) ;
        }

        p -> D = D ;
        p -> Index = Index ;
        p -> Next = q -> Next ;
        q -> Next = p ;
    }
}
void
Print ( List L )
{
    Position p ;
    if ( IsEmpty ( L ) )
    {
        fprintf ( stderr, "Print :List is Empty.\n" ) ;
        return ;
    }
    p = L -> Next ;
    printf ( "Polynomial :\n" ) ;
    while ( p != NULL )
    {
        putchar ( p -> D > 0 ? '+' : '-' ) ;
        printf ( " %.1f", p -> D ) ;
        if ( 0 == p -> Index )
        ;
        else
        if ( 1 == p -> Index )
            putchar ( 'x' ) ;
        else
            printf ( "x^%d ", p -> Index ) ;
      
        p = p -> Next ;
    }
    putchar ( '\n' ) ;
}

void
DisposeList ( List L )
{
    MakeEmpty ( L ) ;
    free ( L ) ;
}




/***************     main.c      ************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int IsEven ( int n ) ;
List PowPolynomial ( List L, int n ) ;        //求多项式L的n次幂
List PolyMultiply ( List L1, List L2 ) ;      //求多项式L1与L2的乘积
int
main ( void )
{
    List L ;
    int n ;
    ElementDouble d ;
    ElementInt    index ;
    L = CreatList () ;
    printf ( "Please input a polynomial:\n" ) ;
    scanf ( "%lf%d", &d, &index ) ;
    while ( d != 0 )
    {
        Insert ( d, index, L ) ;  
        scanf ( "%lf%d", &d, &index ) ;
    }
    Print ( L ) ;

    printf ( "Please input polynomial index:" ) ;
    scanf ( "%d", &n ) ;
    if ( 0 == n )
    {
        printf ( "Polynomial : 1\n" ) ;
        return 0 ;
    }
    else
    if ( 1 == n )
        Print ( L ) ;
    else
    {
        L = PowPolynomial ( L, n ) ;
        Print ( L ) ;
    }
    DisposeList ( L ) ;
    return 0 ;
}
List
PowPolynomial ( List L, int n )
{
    if ( 1 == n )
        return L ;
    else
    {
        if ( IsEven ( n ) )
            return PowPolynomial ( PolyMultiply ( L, L ), n / 2 ) ;
        else
            return PolyMultiply ( PowPolynomial ( PolyMultiply ( L, L ), n / 2 ), L ) ;
    }
  
}
List
PolyMultiply ( List L1, List L2 )
{
    List L ;
    Position p1, p2 ;
    p1 = L1 -> Next ;
    p2 = L2 -> Next ;
    if ( NULL == p1 || NULL == p2 )
        return NULL == p1 ? L2 : L1 ;
    L = CreatList () ;
    while ( p1 != NULL )
    {
        p2 = L2 -> Next ;
        while ( p2 != NULL )
        {
            Insert ( p1 -> D * p2 -> D, p1 -> Index + p2 -> Index, L ) ;
            p2 = p2 -> Next ;
        }
        p1 = p1 -> Next ;
    }
    return L ;
}
int
IsEven ( int n )
{
    return 0 == n % 2 ;
}



[ 本帖最后由 Juson 于 2013-4-9 19:15 编辑 ]
2013-04-09 18:17
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
收藏
得分:0 
代码我全都贴出来的,有木有别的好的算法呢
2013-04-10 20:34
快速回复:求一个快速的计算多项式幂的算法
数据加载中...
 
   



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

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