输入包含多组测试数据,每组测试数据一行。 每行两个整数,n和m,0<m<=n<=10000,n=0标志输入结束,该组数据不用处理。
对于每个输入,输出排列数p(n, m)的二进制表示后面有多少个连续的零。每个输出放在一行。
10 5 6 1 0 0
5 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws ArithmeticException {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int n = scan.nextInt();
int m = scan.nextInt();
// 检测到n为零,返回
if (n == 0) {
return;
}
// 根据公式得到p
int p = factorial(n) / factorial(n - m);
// 将p转成二进制串
String str = Integer.toBinaryString(p);
// 逆向字符串,为了得到后面连续的0的个数
String reverse = new StringBuilder(str).reverse().toString();
int count = 0;
for (int i = 0; i < reverse.length(); i++) {
if (reverse.charAt(i) == '0') {
count++;
}
else {// 第一次遇到1就break,此时的count已经是答案
break;
}
}
System.out.println(count);// 输出count,即是答案
}
}
// 递归计算阶乘
private static int factorial(int n) {
// TODO Auto-generated method stub
if (n == 0 || n == 1) {
return 1;
}
else {
return n * factorial(n - 1);
}
}
}
0×0=0
0×1=1×0=0
1×1=1
例如:1001和1010相乘的过程如下:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while(in.hasNextInt())
{
int n=in.nextInt();
int m=in.nextInt();
if(n==0)
break;
int res=0;
for(int i=n-m+1;i<=n;++i)
{
int tmp=i;
while((tmp&1)==0)
{
++res;
tmp>>=1;
}
}
System.out.println(res);
}
in.close();
}
}