博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer AccurateFactorial 计算精确的阶乘
阅读量:4207 次
发布时间:2019-05-26

本文共 1550 字,大约阅读时间需要 5 分钟。

题目描述:

输入不超过1000的正整数n,输入n!=1*2*3..*n的精确结果

思路:

初步计算1000!大概是4*10^2567 所以基本数据类型是无法保存这么大的数的 我们可以考虑使用数组保存 同时为了防止进位产生溢出 我们倒序从低位到高位保存,即f[0]是个位 f[1]是十位 f[2]是百位..

public class AccurateFactorial {
private static final int ARRAY_SIZE = 3000; private static int[] array; /** * 计算数的精确阶乘 */ public static int[] accurateFactorial(int num) { //每次调用重新初始化 否则数据会重复 QAQ array = new int[ARRAY_SIZE]; array[0] = 1; for (int i = 2; i <= num; i++) {
//因为1乘任何数都为本身 因此阶乘直接从2开始 int carry = 0;//进位 for (int j = 0; j < ARRAY_SIZE; j++) { int temp = array[j] * i + carry; array[j] = temp % 10;//个位 carry = temp / 10; } } return array; }}

测试:

@Test    public void testAccurateFactorial() throws Exception {        int[] ints = AccurateFactorial.accurateFactorial(30);        print(ints);        System.out.println();        ints = AccurateFactorial.accurateFactorial(10);        print(ints);    }    /**     * 打印结果数组[逆向打印 且排除先导0]     */    private void print(int[] array) {        int i;        for (i = array.length - 1; i >= 0; i--) {
//排除先导0 if (array[i] != 0) { break; } } for (int j = i; j >= 0; j--) { System.out.print(array[j]); } } @Test public void test() throws Exception { int[] a = new int[10]; for (int i = 0; i < a.length; i++) { System.out.println(a[i]); } }

注意 因为存放的时候是倒序存放的 因此打印的时候从数组尾部开始打印 并且要注意排除先导0


转载地址:http://bhqli.baihongyu.com/

你可能感兴趣的文章
CSS3选择器:nth-child和:nth-of-type之间的差异
查看>>
微信小程序知识点GET
查看>>
微信小程序组件知识点GET
查看>>
微信小程序API~GET
查看>>
springboot实践1
查看>>
技术管理规划-设定团队的职能
查看>>
技术管理规划-如何设定团队的目标
查看>>
技术管理规划-如何规划团队的架构
查看>>
技术管理规划-路径跟资源
查看>>
技术管理角色认知-管理都需要做哪些事
查看>>
管理角色认知-工程师到管理者角色发生了哪些变化?
查看>>
管理角色认知-新晋管理常常犯的错
查看>>
管理任务执行-如何排任务优先级
查看>>
管理任务执行-有效执行
查看>>
管理任务执行-如何制定有效的机制
查看>>
管理沟通-沟通框架
查看>>
java8-计算时间差的方法
查看>>
lombok深入实践
查看>>
java8-新的日期API
查看>>
java8-Optional的引入
查看>>