输入包含多组测试数据,每组测试数据一行。 每行两个整数,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(); } }