链表实现大数类阶乘

链表实现大数阶乘

题目

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

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

时间: 2024-11-08 20:39:01

链表实现大数类阶乘的相关文章

动手动脑-大数类

前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗? 要求: (1)用你的大数类实现加和减两个功能 (2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的? (3)通过互联网查找大数运算的相关资料,给你的大数类添加乘.除.求阶乘等其它功能. public class Factorial{ private static final int MAX = 1000000000; public static

HDU高精度总结(java大数类)

  HDU1002   A + B Problem II [题意]大数相加 [链接]http://acm.hdu.edu.cn/showproblem.php?pid=1002 Sample Input 2 1 2 112233445566778899 998877665544332211 Sample Output Case 1: 1 + 2 = 3 Case 2: 112233445566778899 + 998877665544332211 = 1111111111111111110 代码

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

单链表的结点类模板

C++语言程序设计进阶 (2015年秋) 郑莉教授 http://www.xuetangx.com/courses?org=-1&cid=117&page_type=0&page=2 单链表 //单链表的结点类模板 template <class T> class Node{ private: Node<T> *next;//后继结点的指针 public: T data; Node(const T& item,Node<T>*next =

大数类模板(+-*/%等等)

注意:必需先定义,再使用. #include <iostream> #include <cstring> using namespace std; #define DIGIT 4 //ËÄλ¸ô¿ª,¼´Íò½øÖÆ #define DEPTH 10000 //Íò½øÖÆ #define MAX 1000 typedef int bignum_t[MAX+1]; /*********************************************************

NYOJ 大数类总结(java)

棋盘覆盖 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=45 样例输入 3 1 2 3 样例输出 1 5 21 代码如下: import java.io.*; import java.util.*; import java.math.BigDecimal; import java.math.BigInteger;//声明BigInteger大数类 public class Main { public static void main(

【大数类模板】hdoj 4927 Series 1

题目很简单:分析发现满足杨辉三角,有通项公式,但是是高精度,大数题目. 记录一个大数类模板:以后好用 代码: #include<cstdio> #include<cstring> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 class BigInt { private: int a[500]; int len; public: BigInt() {len = 1; memset(a

HDU 5047 Sawtooth (JAVA大数类)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 题面: Sawtooth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1636    Accepted Submission(s): 637 Problem Description Think about a plane: ● O

Java常用类(二) Scanner类和大数类

二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学Java时都会先找输入输出(指标准输入输出),Java的输出就非常常见,任何一个Java教程基本都是以输出开始的,然而输入却在很后面提到,因为Java的输入不似输出那么简单.现在我们就来介绍一下实现输入的Scanner类. 1.Scanner基本使用方法和next()系列方法 一个从键盘输入的基本示例: imp