例题:
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
public class jieceng {
private static Scanner sc;
public static void main(String[] args) {
sc = new Scanner(System.in);
int n=sc.nextInt();
ArrayList list=new ArrayList();//创建集合数组
list.add(BigInteger.valueOf(1));//往数组里添加一个数值
for(int i=list.size();i<=n;i++) {
BigInteger lastfact=(BigInteger)list.get(i-1);//获得第一个元素
BigInteger nextfact=lastfact.multiply(BigInteger.valueOf(i));;//获得下一个数组
list.add(nextfact);
}
System.out.println((BigInteger)list.get(n));
//循环写法
/*int sum=1;
for(int index=1;index<=n;index++) {
sum*=index;
}
System.out.println(sum);*/
/*if(n==1) {
System.out.println(1);
}
else {
int sum[]=new int[10000];
int sum[0]=1;
for(long index=1;index<=n;index++) {
sum[index]*=index;
}
System.out.println(sum);
}*/
//数组添加
/*else {
int s[]=new int[100000];
int tail=0,head=0,p=0;
int i,j;
for(i=2;i<=n;i++) {
for(j=head;j<=tail;j++) {
p=s[j]*i+p;
s[j]=p%10;
p=p/10;
}
while(p!=0) {
tail++;
s[tail]=p%10;
p=p/10;
}
}
for(i=tail;i>=0;i--) {
System.out.println(s[i]);
}
}*/
}
}
知识点:
1.BigIntger方法总结:https://www.jianshu.com/p/8b89ab19db84
2.阶乘的多种算法:https://blog.youkuaiyun.com/yue_2018/article/details/85227848
3.ArrayList详解:https://blog.youkuaiyun.com/sihai12345/article/details/79382649
正常情况下一个整数最多只能放在long类型之中,但是如果现在有如下的一个数字超级大根本就是无法保存的,所以为了解决这样的问题,在java中引入了两个大数的操作类:
操作整型:BigInteger
操作小数:BigDecimal
BigInteger abs() 返回大整数的绝对值
BigInteger add(BigInteger val) 返回两个大整数的和
BigInteger and(BigInteger val) 返回两个大整数的按位与的结果
BigInteger andNot(BigInteger val) 返回两个大整数与非的结果
BigInteger divide(BigInteger val) 返回两个大整数的商
double doubleValue() 返回大整数的double类型的值
float floatValue() 返回大整数的float类型的值
BigInteger gcd(BigInteger val) 返回大整数的最大公约数
int intValue() 返回大整数的整型值
long longValue() 返回大整数的long型值
BigInteger max(BigInteger val) 返回两个大整数的最大者
BigInteger min(BigInteger val) 返回两个大整数的最小者
BigInteger mod(BigInteger val) 用当前大整数对val求模
BigInteger multiply(BigInteger val) 返回两个大整数的积
BigInteger negate() 返回当前大整数的相反数
BigInteger not() 返回当前大整数的非
BigInteger or(BigInteger val) 返回两个大整数的按位或
BigInteger pow(int exponent) 返回当前大整数的exponent次方
BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数
BigInteger leftShift(int n) 将当前大整数左移n位后返回
BigInteger rightShift(int n) 将当前大整数右移n位后返回
BigInteger subtract(BigInteger val)返回两个大整数相减的结果
byte[] toByteArray(BigInteger val)将大整数转换成二进制反码保存在byte数组中
String toString() 将当前大整数转换成十进制的字符串形式
BigInteger xor(BigInteger val) 返回两个大整数的异或
ArrayList 底层是基于数组来实现容量大小动态变化的。
list.size():代表的是list里面有多少个元素。像这个程序新new出来的,里面还没有存数据,那么就是0 。
list.add(BigInteger.valueOf(1))
for(int i=*list.size()* ;i<=n;i++) {
BigInteger lastfact=(BigInteger)list.get(i-1);
BigInteger nextfact=lastfact.multiply(BigInteger.valueOf(i));
list.add(nextfact);
}
该博客探讨了如何使用Java的BigInteger类处理大整数计算,特别是解决阶乘问题。通过介绍一个输入正整数n并输出n!的例题,阐述了使用数组表示大整数及处理进位的方法。同时,提到了BigIntger的重要方法和阶乘的多种算法,并链接了相关资源进行深入学习。此外,还简单介绍了ArrayList的数据结构和常用操作。
689

被折叠的 条评论
为什么被折叠?



