编程之美--不要被阶乘吓倒 求N!的质因数2的个数

求N!的二进制表示中最低位1的位置

 

 

解答:等于是求N!的质因数2的个数

有两种代码表示方式

第一种:

假设是8! 有1 2 3 4 5 6 7 8

第一次 则它有 2 4 6 8四个具有2的质因数

第二次 2 4 6 8变为 1 2 3 4 则只有 2 4具有2的质因数

第三次 2 4 变为 1 2 则只有2 具有2的质因数

 

公式 f(n) = (n/2) + (n/4) + (n/8) + (n/16) + ...   

/// <summary>

        /// 获得N!的质因数2的个数

        /// </summary>

        /// <param name="n">N!中N的值</param>

        /// <returns></returns>

        public static int GetNum(int n)

        {

            int num;

            num = 0;

            while(n>0)

            {

                n >>= 1;

                num += n;

            }

            return num;

        }

第二种方法 遍历每个数 每个数的2 的质因数之和就是总的质因数

        public static int GetAntherNum(int n)

        {

            int num;

            num = 0;

            for (int i = n; i > 1; )

            {

                while (i % 2 == 0 && i / 2 != 0)

                {

                    num++;

                    i /= 2;

                }

                i = --n;

            }

            return num;

        }

最后 取得最低位1的位置 就是N!的质因数2的个数+1。
时间耗费测试 运用到using System.Diagnostics中的 Stopwatch类
        static void Main(string[] args)
        {
         
            Stopwatch sw = new Stopwatch();
            sw.Start();
            int testNum = GetNum(5000);
            sw.Stop();
            Console.WriteLine(testNum);
            Console.WriteLine(sw.Elapsed.TotalMilliseconds.ToString());
   //         sw = Stopwatch.StartNew(); //一种从新计时的方法
            sw.Reset();
            sw.Start();
            testNum = GetAntherNum(5000);
            sw.Stop();
            Console.WriteLine(testNum);
            Console.WriteLine(sw.Elapsed.TotalMilliseconds.ToString());
        }
输出结果如下 :
4995
0.1289
4995
0.3097   
可以知道 第一种算法 时间复杂度为O(logn) 第二种算法 时间复杂度为O(nlogn)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值