链表实现大数类阶乘

Posted titordong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表实现大数类阶乘相关的知识,希望对你有一定的参考价值。

链表实现大数阶乘

题目

大数运算——计算n的阶乘 (n≥20)。

基本要求

(1)数据的表示和存储:
①累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求。
②试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
(2)数据的操作及其实现:
基于设计的存储结构实现乘法操作,要求从键盘上输入n值;在屏幕上显示最终计算结果。

思路

建立大数类(其实好像想麻烦了),不过面向对象的方法还挺好写的,重载乘法,这里我搞麻烦了,一开始重载了大数乘法,其实弄一个大数乘整数就行了,然后其他的比较简单了,主要是细节,一直改Bug,终于好了。

1)类定义

class Biginteger {
    Node *first;
    int length;
public:
    Biginteger() {
        first = new Node(0);
    }
    Node *GetHead() {
        return first;
    }
    friend ostream&operator<<(ostream &, const Biginteger&);
    friend istream&operator>>(istream &, Biginteger&);
    Biginteger operator+(int);
    Biginteger operator*(Biginteger &);
    Biginteger operator*(int);
    bool operator==(Biginteger&);
    Biginteger Cal_Mul(Biginteger&);
    Biginteger Cal_Mul(int);
    void Delete();
};

2)类实现(只有关键部分)

Biginteger Biginteger::operator*(int R)
{
    Biginteger C;
    Node *pc = C.first, *pa = GetHead()->link;
    pc->insertAfter(0);
    int t = R % 10;
    int temp;
    int n;
    int num = 0;
    while (R) {
        pa = GetHead()->link;
        pc = C.GetHead();
        n = 0;
        while (n < num) {
            pc = pc->link;
            n++;
        }
        num++;
        while (pa != NULL) {
            temp = t * pa->value;
            if (pc->link == NULL) {
                pc->insertAfter(temp % 10);
            }
            else {
                pc->link->value += (temp % 10);
            }
            pc = pc->link;
            if (pc->value >= 10) {
                if (pc->link == NULL) {
                    pc->insertAfter((pc->value) / 10);
                }
                else {
                    pc->link->value += ((pc->value) / 10);
                }
                pc->value = (pc->value) % 10;
            }
            if (temp >= 10) {
                if (pc->link == NULL) {
                    pc->insertAfter(temp / 10);
                }
                else {
                    pc->link->value += (temp / 10);
                }
                if (pc->link->value >= 10) {
                    if (pc->link->link == NULL) {
                        pc->link->insertAfter((pc->link->value) / 10);
                    }
                    else {
                        pc->link->link->value += ((pc->link->value) / 10);
                    }
                    pc->link->value = (pc->link->value) % 10;
                }
            }

            pa = pa->link;
        }
        R /= 10;
        t = R % 10;
        if (pc->link == NULL && pa != NULL)
            pc = pc->insertAfter(0);
        else    pc = pc->link;
    }
    return C;
}

3)阶乘实现

Biginteger Biginteger::Cal_Mul(int R) {
    Biginteger ans;
    ans.first->insertAfter(1);
    if (R == 1) {
        return ans;
    }
    for (int i(2); i <= R; i++) {
        ans = ans * i;
    }
    return ans;
}

后记

依旧没有注释,提供一种思路吧,其实我觉得我写的很糙,太长了,而且一个结点只存了一个数字,有点浪费,不过亲测可用,思路差不多的可以参考一下。
2018/11/14 23: 31:14

以上是关于链表实现大数类阶乘的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 大数阶乘,不用biginteger怎么做

NYOJ题目28大数阶乘

大数的阶乘

大数算法

题目1076:N的阶乘(大数乘法)

大数阶乘