美文网首页
大数阶乘java实现

大数阶乘java实现

作者: 雨夜微凉886 | 来源:发表于2019-10-13 21:25 被阅读0次

节点类

public class Node {
Node pre;
Node next;
int data;

public Node() {
    super();
    
}

public Node(int data) {
    super();
    this.data = data;
}

public Node(Node pre, int data, Node next) {
    super();
    this.pre = pre;
    this.next = next;
    this.data = data;
}

public Node getPre() {
    return pre;
}

public void setPre(Node pre) {
    this.pre = pre;
}

public Node getNext() {
    return next;
}

public void setNext(Node next) {
    this.next = next;
}

public int getData() {
    return data;
}

public void setData(int data) {
    this.data = data;
}

}

双向链表类

public class DblList {

private Node first;
private Node tail;
public void setFirst(Node first) {
    this.first = first;
}

public void setTail(Node tail) {
    this.tail = tail;
}
public DblList() {
    super();
    this.first=new Node();
}

public Node getTail() {
    return tail;
}

public Node getFirst() {
    return first;
}
private Node insert(int data) {
    Node firstnode =this.getFirst();
    //如果链表为空,需要设置尾结点为最先插入的节点
    if(firstnode.next==null) {
        //此时尾结点为空,tailnode不等于尾结点
        Node newNode=new Node(data);
        //设置尾结点
        this.tail=newNode;
        firstnode.next=newNode;
        newNode.pre=firstnode;
        return newNode;
    }
    else {
        Node next = firstnode.getNext();
        Node newNode = new Node(firstnode,data,next);
        next.pre=newNode;
        firstnode.next=newNode;
        return newNode;
    }
}


//大数阶乘核心函数,每个节点最多三位,不足三位的在输出的时候需要补0
public void fac(int n) throws Exception {
    if(n<0) {
        throw new Exception("输入参数不能小于0");
    }
    Node tailNode = this.tail;
    //每次取被乘数都是从后取,判断链表是否为空,为空则先要处理一下链表。确保能取出来节点
    if(tailNode==null) {
        this.insert(1);
        tailNode = this.tail;
    }
    
    //循环乘n次,每次乘都是从后往前遍历。乘数是从1-->n
    for (int i = 1; i < n+1; i++) {
        
        //存放余数,一定放在for循环后,不能之前,否则出错
        int remain=0;
        //设置成从后往前遍历的游标
        Node current=tailNode;
        int result=0;
        //遍历所有节点和乘数相乘
        while(current!=this.first) {
            result=current.data*i;
            //结果和余数相加再取余,结果保留三位
            result=result+remain;
            current.data=result%1000;
            remain=result/1000;
            
            //如果有余数且当前节点的前一个节点为头结点则创建一个节点
            if(remain!=0&&current.pre==this.first) {
                while(remain>999) {
                    //一定要注意取新插入节点为当前节点,否则current=current.pre;这句语句不会转到头结点去,而会到新插入节点去,则又进入第一个while循环
                    Node insertNode = this.insert(remain%1000);
                    current=insertNode;
                    remain=remain/1000;
                }
                Node insertNode = this.insert(remain);
                //一定要注意取新插入节点为当前节点,否则current=current.pre;这句语句不会转到头结点去,而会到新插入节点去,则又进入第一个while循环
                current=insertNode;
            }
            current=current.pre;
        }
    }
    
}
public String output() throws Exception {
    Node firstnode = this.getFirst();
    StringBuffer sb;
    if(firstnode.next==null) {
        throw new Exception("空链表");
    }
    else {
        Node current=firstnode.next;
        sb=new StringBuffer();
        while(current!=null) {
            sb.append(String.format("%3d",current.data ).replace(" ", "0") );
            current=current.next;
        }
    }
    return sb.toString();
    
}

}

测试类

import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception {

for (int i = 20; i < 26; i++) {
    DblList dblList = new DblList();
    dblList.fac(i);
    System.out.println("i="+i+"结果如下");
    System.out.println(dblList.output());
    }
}

}
i=20结果如下
002432902008176640000
i=21结果如下
051090942171709440000
i=22结果如下
001124000727777607680000
i=23结果如下
025852016738884976640000
i=24结果如下
620448401733239439360000
i=25结果如下
015511210043330985984000000

相关文章

  • 大数阶乘java实现

    节点类 public class Node {Node pre;Node next;int data; } 双向链...

  • Java大数阶乘

    阶乘定义:一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘...

  • Java大数阶乘

    Java大数阶乘 描述我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?输入输入...

  • Java 实现阶乘算法

    Java 实现阶乘算法 阶乘算法如下: 以下列出 0 至 20 的阶乘: 0!=1,(0 的阶乘是存在的) 1!=...

  • 大数阶乘--10000的阶乘实现

    普通的阶乘算法: 在数字比较小的时候,以上阶乘算法还能勉强应对,但当数字大于50时,阶乘结果就达到了65位数之多,...

  • 机试常用算法和题型-大数专题

    大数专题 字符加减关系,实现任意长度整数相加 大数加法,进阶转换版 大数浮点数加法 大数运算之阶乘

  • 专题:递归与累加阶乘

    递归实现累加和阶乘 累加核心代码: 阶乘的核心代码: 阶乘的非递归实现思路: 阶乘的非递归实现核心代码:

  • 大数阶乘

    大数阶乘 题目:求阶乘要求:求200以上的数的阶乘。即普通的数据类型是不可能表达出所求的数据。 解题: 方法一:B...

  • 阶乘

    定义 一个正整数的阶乘是指所有小于或等于该正整数的正整数的乘积,记作n!,0的阶乘等于1 Java递归实现 Jav...

  • L1-013. 计算阶乘和

    L1-013. 计算阶乘和 问题描述:L1-013. 计算阶乘和 java代码: 结果

网友评论

      本文标题:大数阶乘java实现

      本文链接:https://www.haomeiwen.com/subject/bnbkmctx.html