阶乘二进制表示末尾1的位置

博客围绕阶乘二进制表示末尾1的位置展开。给定非负整数N,求N!二进制结果中最低位1的位置,最右为位置0。题解指出,该位置取决于1到N的数中因子2的个数,每出现一个因子2,最低位1左移一位。
阶乘二进制表示末尾1的位置

题目描述

给定一个非负整数N,如果用二进制数表达N!的结果,返回最低位的1在哪个位置上,认为最右的位置为位置0。

输入描述:

第一行一个整数N。

输出描述:

输出一个整数表示答案

示例1
输入
1
输出
0
说明
1! = 1,最低位的1在0位置上
示例2
输入
2
输出
1
说明
2 != 2,最低位的1在1位置上
示例3
输入
1000000000
输出
999999987
备注:

1 ⩽ N ⩽ 1 0 18 1 \leqslant N \leqslant 10^{18} 1N1018


题解:

与阶乘末尾 0 的个数相似,最低位的 1 出现在哪个位置,取决于 1~N 的数中有多少个因子 2 ,因为每出现一个因子 2 ,最低位的 1 都会左移一位。

代码:
#include <cstdio>

using namespace std;

typedef long long LL;

int main(void) {
    LL n;
    scanf("%lld", &n);
    LL ret = 0;
    while ( n ) {
        ret += n / 2;
        n >>= 1;
    }
    return 0 * printf("%lld\n", ret);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值