JobInterview

  1. 面试题
    1. N的阶乘

面试题

N的阶乘

要求:

  • 不要用递归 -> 【可以用循环】
  • int, long 会溢出 【数组保存】
/**
 * 计算 n 的阶乘
 * @author Jungle 
 * @version 2023/09/18 17:53
**/
public class calcN {
    public static void main(String[] args) {
//        factorial(3);
//        factorial(10);
        factorial(100);
    }

    public static void factorial(int n) {
        //创建保存结果的数组array
        int[] array = new int[n*n];

        // 参数初始化
        array[0] = 1;
        //位数 bit【几位数】
        int bit = 1;
        //进位 carry
        int carry = 0;

        // eg: 6! = 6 * 5 * 4 * 3 * 2 * 1 = 5! * 6 = 120 * 6
        for(int i = 2;i <= n; i++) {
            // 计算每一轮结果:从2的阶乘开始计算,算到n
            for(int j = 0; j < bit; j++) {
                array[j] = array[j] * i;
            }
            // 1*6=6; 2*6=12; 0*6=0 【i==6时: bit-1 == 2-1 == 1, 进位一个】
            for(int j = 0; j < bit-1; j++) {
                //进位数 【2*6=12 -> 1】
                carry = array[j]/10;
                //每个数组元素都只留下个位数【2*6=12 -> 2】
                array[j] %= 10;
                //上一位加上进位的结果
                array[j+1] += carry;
            }
            //如果最高位大于等于10,那么需要再进一位
            if(array[bit-1] >= 10) {
                int tempCarry = array[bit-1] / 10;
                array[bit-1] %= 10;
                //一直进位直到进位数为0
                while(tempCarry != 0) {
                    array[bit] = tempCarry % 10;
                    tempCarry /= 10;
                    bit++;
                }
            }
        }

        // 6! 的计算结果的表示:0 2 7 【逆序的】
        System.out.println("计算结果: ");
        for(int m = bit - 1; m >= 0; m--) {
            System.out.print(array[m]);
        }
        System.out.println("\n几位数: " + bit);
    }
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jungle8884@163.com

×

喜欢就点赞,疼爱就打赏