标题:求一个快速的计算多项式幂的算法
只看楼主
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
结帖率:100%
已结贴  问题点数:20 回复次数:7 
求一个快速的计算多项式幂的算法
随机输入一个多项式和一个指数,然后求多项式的幂,用链表实现
我在求多项式的积时总是要新建一个链表用于存放结果,然后再释放原来的链表,这样如果指数太大,程序就变得很慢,有没有比较快的算法呢?
搜索更多相关主题的帖子: 指数 多项式 新建 
2013-04-08 16:21
梅可伟梅可伟
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:69
专家分:180
注 册:2013-3-11
得分:3 
代码呢?
2013-04-08 22:18
新手而已
Rank: 2
等 级:论坛游民
帖 子:35
专家分:55
注 册:2013-3-21
得分:3 
码呢?

正在专攻C语言中。。。
  能帮到的就这点。。。
2013-04-08 22:43
mskeheng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:179
注 册:2013-3-13
得分:3 
这个,,,果断抢分
2013-04-08 23:05
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:3 
这样的话,你可以利用栈来进行,利用栈的特点进行中间变量的存储,这样最后留在栈中的应该就是指数最高的,我刚学数据结构,懂的不很多

Maybe
2013-04-08 23:12
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
ly371031846
Rank: 2
等 级:论坛游民
帖 子:40
专家分:79
注 册:2013-4-9
得分:3 
太难我不会
2013-04-09 18:23
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
得分:0 
代码我全都贴出来的,有木有别的好的算法呢
2013-04-10 20:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-403336-1-1.html




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

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