1021: 组合数末尾的零

题目:

Description

 从m个不同元素中取出(≤ m)个元素的所有组合的个数,叫做从m个不同元素中取出n个元素的组合数。组合数的计算公式如下:

C(mn) = m!/((n)!n!) 

现在请问,如果将组合数C(mn)写成二进制数,请问转这个二进制数末尾有多少个零。

 

Input

 第一行是测试样例的个数T,接下来是T个测试样例,每个测试样例占一行,有两个数,依次是mn,其中n ≤ m≤ 1000。Output

 分别输出每一个组合数转换成二进制数后末尾零的数量。

 Sample Input

  2 

  4 2

1000 500 

Sample Output

 1

 6

 思路:

一个十进制数如果是2的多少次方,它的二进制数末尾就有多少个零。

 <1> 分别找出组合数分子,分母中含有2的个数count1,count2;

<2> 所求的末尾0的个数count=count1-count2;

 

注:如果求出组合数后再去求末尾有几个零会超内存;因为题目所要求的范围。

 

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int t,m,n,i,count1,count2,count,x;
 6       cin>>t;
 7 while(t--)
 8 {
 9     count=0;
10     count1=0;
11     count2=0;
12 cin>>m>>n;
13 for(i=n+1;i<=m;i++)
14 {
15    x=i;
16    while(x%2==0)
17 {
18    count1++;
19    x=x/2;
20 }
21 }
22 for(i=m-n;i>=1;i--)
23 {
24   x=i;
25 while(x%2==0)
26 {
27   count2++;
28   x=x/2;
29 }
30 }
31 count=count1-count2;
32 cout<<count<<endl;
33 }
34 return 0;
35 }

 

 

原文地址:https://www.cnblogs.com/fenhong/p/4653578.html