泉州网页建站模板,郑州seo网站关键词优化,长沙装修公司名单,做网站坂田题目描述
求 n ! n! n! 中某个数码出现的次数。
输入格式
第一行为 t ( t ≤ 10 ) t(t \leq 10) t(t≤10)#xff0c;表示数据组数。接下来 t t t 行#xff0c;每行一个正整数 n ( n ≤ 1000 ) n(n \leq 1000) n(n≤1000) 和数码 a a a。
输出格式
对于每组数据表示数据组数。接下来 t t t 行每行一个正整数 n ( n ≤ 1000 ) n(n \leq 1000) n(n≤1000) 和数码 a a a。
输出格式
对于每组数据输出一个整数表示 n ! n! n! 中 a a a 出现的次数。
样例 #1
样例输入 #1
2
5 2
7 0样例输出 #1
1
21.题目分析
输入一个t代表数据的组数每组数据有两个数计算第一个数的阶乘统计阶乘结果中第二个数的出现次数并打印。
乍一看这道题用递归和函数就能轻松解决但是计算阶乘的输入可以是1000的所以又涉及到了高精度的乘法。 本人愚钝之前用c写过A*B的高精度乘法代码很长这道题偷点懒就是用Java的高精度来计算会方便很多。
当然用c也是可以写的用整型数组存储阶乘结果的每一位数字或者用字符数组存储结果都可以。
使用Java计算高精度之前我们要了解Java中BigInteger的用法我在之前的博客中有所提及 BigInteger的用法
2.题目思路
编写一个递归函数 用于计算一个数的阶乘设置递归出口为当n1时返回1 其他情况n连乘递减的函数即可。
输入 t循环t次每一次输入一个正整数和数码调用递归函数得到阶乘 再用while循环得到阶乘结果的每一个数字与数码进行比较并计数。 每循环一轮打印一次计数结果即可。
3.代码实现
import java.math.BigInteger;
import java.util.Scanner;public class Main {public static void main(String[] args) {//新建输入函数Scanner sc new Scanner(System.in);int n, a, t;//计数器int cnt;//输入数据组数t sc.nextInt();for (int i 0; i t; i) {//每一轮计数器归零cnt 0;//输入正整数和数码n sc.nextInt();a sc.nextInt();//调用得到阶乘结果BigInteger res factorial(BigInteger.valueOf(n));//计算每一位中a出现的个数//循环条件等价于 res ! 0while (!res.equals(BigInteger.valueOf(0))) {//等价于 res % 10 a//这里是调用了除法函数返回的是数组商和余数所以索引是1if (res.divideAndRemainder(BigInteger.valueOf(10))[1].equals(BigInteger.valueOf(a))) {cnt;}//等价于 res res / 10res res.divide(BigInteger.valueOf(10));}//打印每一轮的结果System.out.println(cnt);}}//阶乘函数public static BigInteger factorial(BigInteger n) {//等价于 n 1if (n.equals(BigInteger.valueOf(1))) {//等价于 return 1;return BigInteger.valueOf(1);}//等价于 n * factorial(n - 1)return n.multiply(factorial(n.subtract(BigInteger.valueOf(1))));}
}