试题 算法提高 阶乘差

问题描述
  给定n和m以及p,保证n>=m,求(n!-m!)对p取余的结果。
输入格式
  一行三个正整数n,m,p。
输出格式
  一行一个非负整数表示结果。
样例输入
3 2 10
样例输出
4
数据规模和约定
  n,m<=20,p<=10000.
资源限制
时间限制:1.0s 内存限制:256.0MB

思路
因为阶乘的变化量是非常大的,如果是50的阶乘,那么不管是int还long型,都不够用!
这时我们就需要使用大数类,即BigInteger类。
因为题目简单,那我就不多赘述了,上代码吧……

代码块

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		BigInteger n = sc.nextBigInteger();
		BigInteger m = sc.nextBigInteger();
		BigInteger p = sc.nextBigInteger();
		
		BigInteger sumN = new BigInteger("1");//结果值:n
		BigInteger sumM = new BigInteger("1");//结果值:m
		
		BigInteger n1 = new BigInteger("1");
		BigInteger n2 = new BigInteger("1");//不变:1(n)
		BigInteger m1 = new BigInteger("1");
		BigInteger m2 = new BigInteger("1");//不变:1(m)
		BigInteger t = new BigInteger("0");//不变:0
		//System.out.println(n+" "+m+" "+p+" "+sumN+" "+sumM);
		//System.out.println(n1+" "+n2+" "+m1+" "+m2+" "+t);
		//求sumN
		while(true){
			sumN = sumN.multiply(n1);
			n1 = n1.add(n2);
			
			n = n.subtract(n2);
			if(n.equals(t)){
				break;
			}
		}
		//System.out.println(sumN);
		//求sumM
		while(true){
			sumM = sumM.multiply(m1);
			m1 = m1.add(m2);
			
			m = m.subtract(m2);
			if(m.equals(t)){
				break;
			}
		}
		//System.out.println(sumM);
		
		BigInteger res = sumN.subtract(sumM);
		
		System.out.println(res.mod(p));
	}
}

在这里插入图片描述
最后在注意一下,大数类之间判断是否相等,必须使用equals,否者false;使用BigINteger需要引用import java.math.BigInteger;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值