P1591 阶乘数码(Java高精度)

这篇具有很好参考价值的文章主要介绍了P1591 阶乘数码(Java高精度)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

n ! n! n! 中某个数码出现的次数。

输入格式

第一行为 t ( t ≤ 10 ) t(t \leq 10) t(t10),表示数据组数。接下来 t t t 行,每行一个正整数 n ( n ≤ 1000 ) n(n \leq 1000) n(n1000) 和数码 a a a

输出格式

对于每组数据,输出一个整数,表示 n ! n! n! a a a 出现的次数。

样例 #1

样例输入 #1

2
5 2
7 0

样例输出 #1

1
2

1.题目分析

输入一个t代表数据的组数,每组数据有两个数,计算第一个数的阶乘,统计阶乘结果中第二个数的出现次数并打印。

乍一看,这道题用递归和函数就能轻松解决,但是计算阶乘的输入可以是1000的,所以又涉及到了高精度的乘法。
本人愚钝之前用c++写过A*B的高精度乘法,代码很长,这道题偷点懒就是用Java的高精度来计算会方便很多。

当然用c++也是可以写的,用整型数组存储阶乘结果的每一位数字,或者用字符数组存储结果都可以。

使用Java计算高精度之前,我们要了解Java中BigInteger的用法,我在之前的博客中有所提及: BigInteger的用法

2.题目思路

编写一个递归函数:
用于计算一个数的阶乘,设置递归出口为,当n==1时,返回1,
其他情况n连乘递减的函数即可。

输入 t,循环t次,每一次输入一个正整数和数码,调用递归函数得到阶乘,
再用while循环得到阶乘结果的每一个数字,与数码进行比较并计数。
每循环一轮打印一次计数结果即可。文章来源地址https://www.toymoban.com/news/detail-674192.html

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 != 0
            while (!res.equals(BigInteger.valueOf(0))) {
                //等价于 res % 10 == a
                //这里是调用了除法函数,返回的是数组:商和余数,所以索引是1
                if (res.divideAndRemainder(BigInteger.valueOf(10))[1].equals(BigInteger.valueOf(a))) {
                    cnt++;
                }
                //等价于 res = res / 10
                res = res.divide(BigInteger.valueOf(10));
            }
            //打印每一轮的结果
            System.out.println(cnt);
        }
    }

    //阶乘函数
    public static BigInteger factorial(BigInteger n) {
        //等价于 n == 1
        if (n.equals(BigInteger.valueOf(1))) {
            //等价于 return 1;
            return BigInteger.valueOf(1);
        }
        //等价于 n * factorial(n - 1)
        return n.multiply(factorial(n.subtract(BigInteger.valueOf(1))));
    }
}

到了这里,关于P1591 阶乘数码(Java高精度)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高精度加法

    高精度问题是指两个数字非常大,超过了 int ,甚至 long long 的范围,数字的位数甚至能达到 (10^5) ,那么如果要实现这样两个大数字的运算,需要解决以下两个问题: 如何存储? 这样的两个数字相加是不可能用普通类型来存储的,所以我们第一个要解决的问题就是如何存储

    2024年02月08日
    浏览(32)
  • 高精度/前缀和/差分

    存储方式: 整数的长度一般小于1e6 大整数的每一位存储到数组里 存储时低位在前,高位在后,方便进位 高精度加法 每一位相加Ai + Bi + t, t表示进位取值0/1,逢十进一 模板: 高精度减法 每一位相减Ai - Bi - t, t 表示借位取值0/1 模板: 高精度乘法 A * b ,b=10000, len(A) = 1e6 , 乘的

    2024年02月16日
    浏览(30)
  • 高精度除法

    高精度除法和乘法讨论的一样,都是一个大整数和一个小整数之间的运算。 算法思路 根据小学除法一样,我们还是模拟这个过程。 注意这里遍历 (A) 数组的时候要按照我们读数字的顺序,也就是从数组尾部到头部遍历。 每一位的计算过程应该是,上一轮的余数 (r) 乘 (

    2024年02月08日
    浏览(36)
  • 高精度算法笔记·····························

    加法 减法 乘法 除法 高精度加法的步骤: 1.高精度数字利用字符串读入 2.把字符串 翻转 存入两个整型数组A、B 3.从低位到高位,逐位求和,进位,存余 4.把数组C从高位到低位依次输出         1.2为准备         3为加法具体实现(0按位取反为-1,即-1时结束等价于=0)  

    2024年01月21日
    浏览(40)
  • C++高精度问题

    C++中int不能超过2^31-1,最长的long long也不能超过2^63-1,所以我们在题目中如果碰到了很长很长的数,并且需要进行大数运算时,就需要高精度存储。 由于int和long long的限制,我们要想存放很长的数就需要利用数组存储,C++中可以利用STL中的vector容器存储 读取:  由于数据很大,

    2024年01月24日
    浏览(43)
  • 高精度算法详解

    首先要知道为什么需要高精度算法: 高精度算法是 处理大数字 的数学计算方法,当数字过大不能用 int 和 long long 存储时,我们就可以 使用string和vector类型 来存储他们的每一位,然后进行计算。 我们可以先把要输入的两个数字放到vector中存储,注意要 反着存(后边做加法

    2024年01月17日
    浏览(40)
  • 【算法】模拟,高精度

      P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟,值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存,因为如果是正着存的话,进位会有点trouble。 时间复杂度O(max(m,n))    P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (lu

    2024年02月09日
    浏览(36)
  • 高精度乘法

    高精度加减法讨论的是两个大整数之间的运算。 而这里高精度乘除法讨论的是一个大整数和一个小整数之间的关系。 算法思路: 还是模拟小学的乘法列竖式,只不过此时不太一样,原本的列竖式是一位一位的乘,这里需要改变一下思路。 这里直接把小整数当成一个数,所乘

    2024年02月08日
    浏览(34)
  • 高精度减法

    要实现两个高精度数的减法,和高精度加法一样都是模拟竖式计算的过程,主要就是解决以下两个问题。 谁大谁小? 由于这两个数字都很大,但是不知道谁更大,所以要先判断哪个数更大,思路如下: 判断这两个数谁的位数更大,位数更大的自然更大。 如果位数不相同,从

    2024年02月08日
    浏览(34)
  • 高精度加法(含代码)

    例如: 1111111111111+9, 列成 竖式 , 先算个位, 1 + 9 = 10 , 满 10 , 向十位进 1 。 接下来, 处理 进位 。 十位: 1+1=2 - 2 百位: 无进位, 直接照抄. 1 - 1 千位: 1 - 1 万位: ... ...: ... 最高位: 1 - 1 最终结果: 所以, 1111111111111+ 9 = 1111111111120 1111111111111+8888888888889, 这个算式变成了 高精度 + 高精度

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包