c语言入门一道比较有意思的题目
题目描述
求N!的二进制表示中最低位1的位置。
输入
一个正整数N(0 <N <= 3000 )
输出
一个整数。
样例输入
4
样例输出
4
提示
4!=(24)10=(11000)2
数据范围是0-3000,所以先求出阶乘在转换为二进制求后面几个零是不现实的,我在列举数据1-5之后摸索出了规律数据如下
测试数据 1 2 3 4 5
测试数据的二进制 1 10 11 100 101
测试数据的阶乘 1 2 6 24 120
测试数据的二进制数 1 10 110 11000 1111000
总结规律为N!的二进制数后零的个数为1-N的二进制数后零的个数之和。
AC代码
#include <stdio.h>
int main (void)
{
int n,i,sum=0,a,yushu,digit;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
digit=0;
a=i;
do{
yushu=a%2;
if(yushu!=0)
break;
a=a/2;
digit++;
}while(yushu==0);
sum=sum+digit;
}
printf("%d\n",sum+1);
}