LintCode #2 尾部的零

Posted 只为成功找方向,不为失败找借口

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode #2 尾部的零相关的知识,希望对你有一定的参考价值。

计算阶乘尾部的0的个数,初一看很简单。

先上代码

public static long GetFactorial(long n)
        {
            if (n == 0 || n == 1)
                return 1;

            return n*GetFactorial(n - 1);
        }


//Main方法中调用

            var result = GetFactorial(11);

            int num = 10;
            int count = 0;
            while (true)
            {
                if (result % num == 0)
                {
                    num = num * 10;
                    count++;
                }
                else
                {
                    break;
                }
            }
//count就是最终的结果

提交以后才发现问题,计算阶乘的数太大,会导致溢出。查了会资料,用数组存储数字,就不会有溢出的问题了。比如数字120, 存在数组里的结果是 a[0]=0, a[1]=2, a[2]=1

 

public static List<int> GetFactorial(int n)
        {
            List<int> r = new List<int>()
            {
                1
            };

            if (n == 0 || n == 1)
                return r;

            int num = 0;

            for (int j = 1; j <= n; j++)
            {
                for (int i = 0; i < r.Count; i++)
                {
                    var tmp = r[i] * j + num;
                    if (tmp > 9)
                    {
                        r[i] = tmp % 10;
                        num = tmp / 10;
                    }
                    else
                    {
                        r[i] = tmp;
                        num = 0;
                    }
                }

                if (num > 0)
                {
                    r.Add(num);
                    num = 0;
                }
            }

            return r;
        }

//Main方法中调用, count就是最终的结果
var list = GetFactorial(105);

            int count = 0;
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i] == 0)
                {
                    count++;
                }
                else
                {
                    break;
                }
            }

 计算105或者在大一点的数据的阶乘没有问题,不过在提交的时候有又情况了。

LintCode给出的测试数据是1001171717的阶乘,期望结果是250292920。提示错误为:Memory Limit Exceeded。一定是在用数组存储阶乘结果的时候,内存超限了。

运行了一下,想看看这个数的阶乘是多少,结果运行了好长时间还没有算完,还需要进行优化,考虑中...

以上是关于LintCode #2 尾部的零的主要内容,如果未能解决你的问题,请参考以下文章

LintCode 2. 尾部的零

LintCode 尾部的零

2. 尾部的零简单

2.尾部的零

如何优化C ++代码的以下片段 - 卷中的零交叉

小数去除尾部的0