要找到滿足題意的數,
就是小於等於n的最大的2的冪,
證明:
假設這個數m是2^k,並且2^k小於等於n。
那麽它有k個質因子(都是2),
反證法:
假如某個數x有k+1個因子,
質數裏面最小的是2,那麽該數x壹定滿足:
m<2^(k+1)<=x<=n
因為m是小於等於n的最大的2的冪,因此x不存在。
所以m就是小於等於n的最大的2的冪。
(註意這裏說的是最多有k個因子,最小的是2^k,k個因子還可能是2^(k-1)*3,也是有可能的,但是就是不可能有k+1個因子)
代碼:
#include?<stdio.h>unsigned?flp2(unsigned?x)
{
x?=?x?|?(x?>>?1);
x?=?x?|?(x?>>?2);
x?=?x?|?(x?>>?4);
x?=?x?|?(x?>>?8);
x?=?x?|?(x?>>?16);
return?x?-?(x?>>?1);
}
int?main()
{
printf("%u",?flp2(1000000000));
return?0;
}