码迷,mamicode.com
首页 > 其他好文 > 详细

链表实现大数类阶乘

时间:2018-11-15 01:40:42      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:==   length   class   亲测   const   after   big   数字   面向对象   

链表实现大数阶乘

题目

大数运算——计算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

链表实现大数类阶乘

标签:==   length   class   亲测   const   after   big   数字   面向对象   

原文地址:https://www.cnblogs.com/Titordong/p/9961129.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!