精华内容
下载资源
问答
  • 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理...

    /**

    问题描述

    输入一个正整数n,输出n!的值。

    其中n!=1*2*3*…*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

    */

    package jiChuLianXi;

    import java.util.Scanner;

    public class Factorial {

    public static String multiply(String num1, String num2) {

    if(num1.length()==0||num2.length()==0) return "";

    int[] ret=new int[num1.length()+num2.length()];//int数组,存放计算结果,最长为两个数的长度和

    for(int i=num1.length()-1;i>=0;i--){//从num1的最低位开始算

    for(int j=num2.length()-1;j>=0;j--){//从num2的最低位开始,乘以num1的每一位

    int t=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');//计算num1[i]与num2[j]的结果;'0'表示0字符的ascll码值,减去它就得到了该字符相对应的数字

    t+=ret[i+j+1];//将结果与低位原本有的数相加

    ret[i+j+1]=t%10;//低位现在的值是t对10取余

    ret[i+j]+=t/10;//低位的进位加到高位上,这里高位上的值可能会超过10,但是没有关系,这里的高位是之后另外两数相乘的低位,

    //会先加这个结果再取余,就像上面两步。所以num1和num2从低位开始加就保证了i+j是从小到大的,保证了所有位上的数最终都不过超过10

    }

    }

    StringBuilder sb=new StringBuilder();/*在程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号

    *来实现,但是这种方式达到目的的效率比较低,且每执行一次都会创建一个String对象,

    *即耗时,又浪费空间。使用StringBuilder类就可以避免这种问题的发生*/

    int i=0;

    while(i

    for(;i

    *则效率会非常高,因为会进行编译时优化,这个时候StringBuilder的append()是达不到

    *的。如果将String的"+"放在循环中,会创建很多的StringBuilder对象,并且执行之后

    *会调用toString()生成新的String对象,这些对象会占用大量的内存空间而导致频繁的GC,从而效率变慢。*/

    return sb.toString();

    }

    public static String Fact(int n){

    String res = "1";

    for(int i=1; i<=n; i++){

    res = multiply(res, i+"");

    }

    return res;

    }

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Scanner in = new Scanner(System.in);

    int n = in.nextInt();

    System.out.println(Fact(n));

    in.close();

    }

    }

    来源:https://www.cnblogs.com/LieYanAnYing/p/12190849.html

    展开全文
  • 高精度计算阶乘-Java

    2021-03-15 23:51:33
    该楼层疑似违规已被系统折叠隐藏此楼查看此楼/*** Created by fx on 2017/7/20.*/public class BigInteger{/*** 计算进位* @param bit 数组* @param pos 用于判断是否是数组的最高位*/private void carry(int[] bit,...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    /**

    * Created by fx on 2017/7/20.

    */

    public class BigInteger

    {

    /**

    * 计算进位

    * @param bit 数组

    * @param pos 用于判断是否是数组的最高位

    */

    private void carry(int[] bit, int pos)

    {

    int i ,carray = 0;

    for(i = 0 ; i<= pos ;i++)//从0到pos逐位检查是否需要进位

    {

    bit[i] += carray;//累加进位

    if(bit[i] <= 9) //小于9不进位

    {

    carray = 0;

    }else if(bit[i] > 9 && i < pos) //大于9但不是最高位

    {

    carray = bit[i]/10; //保存进位值

    bit[i] = bit[i]%10; //得到改位的一位数

    }

    else if(bit[i] > 9 && i >= pos) //大于9且是最高位

    {

    while(bit[i] > 9) //循环向前进位

    {

    carray = bit[i]/10; //计算进位值

    bit[i] = bit[i]%10; //当前的一位数

    i++;

    bit[i] = carray;

    }

    }

    }

    }

    /**

    * 大整数阶乘

    * @param bigInteger 所计算的大整数

    */

    private void bigFactorial(int bigInteger)

    {

    int pos =0;//

    int digit;//数据长度

    int a , b ;

    int m = 0 ;//统计输出位数

    int n = 0 ;//统计输出行数

    double sum = 0;//阶乘位数

    for(a = 1 ; a <= bigInteger ; a ++)//计算阶乘位数

    {

    sum += Math.log10(a);

    }

    digit = (int)sum + 1;//数据长度

    int[] fact = new int[digit];//初始化一个数组

    fact[0] = 1;//设个位为 1

    for(a = 2 ; a <= bigInteger ; a++ )//将2^bigInteger逐个与原来的积相乘

    {

    for(b = digit-1 ; b >= 0 ; b--)//查找最高位{}

    {

    if( fact[b] != 0 )

    {

    pos = b ;//记录最高位

    break;

    }

    }

    for(b = 0; b <= pos ; b++)

    {

    fact[b] *= a ;//每一位与i乘

    }

    carry(fact,pos);

    }

    for(b = digit-1 ; b >= 0 ; b --)

    {

    if(fact[b] != 0)

    {

    pos = b ;//记录最高位

    break;

    }

    }

    System.out.println(bigInteger +"阶乘结果为:");

    for(a = pos ; a >= 0 ; a --)//输出计算结果

    {

    System.out.print(fact[a]);

    m++;

    if(m % 5 == 0)

    {

    System.out.print(" ");

    }

    if(40 == m )

    {

    System.out.println("");

    m = 0 ;

    n ++;

    if(10 == n )

    {

    System.out.print("\n");

    n = 0;

    }

    }

    }

    System.out.println("\n"+"阶乘共有: "+(pos+1)+" 位");

    }

    public void doBigFactorial(int bigInteger)

    {

    int timeBegin=(int) System.currentTimeMillis();

    this.bigFactorial(bigInteger);

    int timeFinishi=(int) System.currentTimeMillis();

    int time = timeFinishi-timeBegin;

    System.out.println("计算耗时: " + time +"毫秒" );

    }

    public static void main(String[] args)

    {

    BigInteger bi = new BigInteger();

    bi.doBigFactorial(100000);

    }

    }

    展开全文
  • 描述用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。输入正整数n,输出计算结果S。格式输入格式一个正整数n。输出格式计算结果S。样例输入样例5输出样例153限制时间限制:1000 ...

    描述

    用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。

    输入正整数n,输出计算结果S。

    格式

    输入格式

    一个正整数n。

    输出格式

    计算结果S。

    样例

    输入样例

    5

    输出样例

    153

    限制

    时间限制:1000 ms

    内存限制:65536 KB

    题目其实很简单的,这个题可以拆分为两个题,一个是高精度运算求阶乘,另一个是高精度运算求和。

    对于高精度运算,一般都是用数组要储存数据。

    #include

    using namespace std;

    const int maxn = 50005;

    int ans[maxn], tmp[maxn];

    void multiply(int j){ //求阶乘

    for (int i=1; i<=j; i++) {

    int tmpa = 0;

    for (int k=0; k

    tmp[k] = tmp[k]*i + tmpa;

    tmpa = tmp[k] / 10;

    tmp[k] = tmp[k] % 10;

    }

    }

    }

    void add(){ //求和

    int tmpb=0;

    for (int i=0; i

    tmpb += ans[i] + tmp[i];

    int cur = tmpb % 10;

    tmpb = tmpb / 10;

    ans[i] = cur;

    }

    }

    int main()

    {

    int n, m;

    scanf ("%d", &n);

    memset(ans, 0, sizeof(ans));

    for (int i=1; i<=n; i++) {

    memset(tmp, 0, sizeof(tmp));

    tmp[0] = 1;

    multiply(i);

    add();

    }

    for (int i=maxn-1; i>=0; i--) {

    if (ans[i]) {

    m = i;

    break;

    }

    }

    for (int i=m; i>=0; i--) {

    printf ("%d", ans[i]);

    }

    }

    展开全文
  • 目录试题 基础练习 阶乘计算要点思路代码(无注释)代码(含有注释) 试题 基础练习 阶乘计算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述  输入一个正整数n,输出n!的值。  其中n!=123*…*n。 算法描述 ...
  • 基础练习 阶乘计算 时间限制:1.0s 内存限制:512.0MB 问题描述  输入一个正整数n,输出n!的值。  其中n!=123*…*n。 算法描述  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个...

    基础练习 阶乘计算
    时间限制: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

    解题思路:用数组来存放阶乘结果,每一位当做一位数,这里有两点要注意:
    1、当乘一位出现得到三位或者二位数时,要注意进位,而且数组假如考虑加到之前已赋值的部分,将会比较复杂,所以考虑依次进位赋值,数组倒序输出。
    2、倒序输出时,倒序判断首位一定不为0,然后记录位置,输出即可。

    代码如下:

    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner sc=new Scanner(System.in);
    		int n=sc.nextInt();
    		int a[]= new int[4000];
    		a[0]=1;
    		int r1=0;//考虑进位情况
    		for(int i=2;i<=n;i++) {
    			for(int j=0;j<4000;j++) {
    				r1=a[j]*i+r1;
    				a[j]=r1%10;  //如果发生进位将个位赋给当前位置,十位或者和百位一起加到下一次数组乘法
    				r1=r1/10;   //依次类推
    			}
    		}
    		int s=0;
    		for(int i=3999;i>=0;i--) {
    			if(a[i]!=0) {
    				System.out.print(a[i]);  //从后往前倒排,然后判断首位不为空则输出
    				s=i;   //同时记录下标
    				break;
    			}
    		}
    		for(int i=s-1;i>=0;i--) {
    			System.out.print(a[i]);   //倒着输出
    		}
    		
    
    	}
    
    }
    
    
    展开全文
  • 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理...
  • 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。 使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • 试题 基础练习 阶乘计算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述  输入一个正整数n,输出n!的值。  其中n!=123*…*n。 算法描述  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的...
  • 学会Java之后的第一题高精度 题意 输入 nnn 输出 S=1!+2!+⋯+n!S=1!+2!+\cdots+n!S=1!+2!+⋯+n! 数据范围 n≤50n\le 50n≤50 思路 nnn 比较大,高精度推荐用Java编写。 相关高精度代码: 【0】读入一个高精度大数 ...
  • 学前热身 1:阶乘计算 #include <bits/stdc++.h> using namespace std; int A[10000] = {0}; //存结果,注意大的静态数组要定义在全局 int main(){ int n; cin >> n; A[0] = 1; for...
  • Java 蓝桥杯 阶乘计算

    2021-11-24 16:01:50
    可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • 试题 基础练习 阶乘计算 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述  输入一个正整数n,输出n!的值。  其中n!=123*…*n。 算法描述  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的...
  • JAVA蓝桥阶乘计算

    2020-04-14 11:09:47
    可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • 基础练习 阶乘计算

    2018-08-23 21:11:41
    可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • Java求10000的阶乘

    2020-10-28 11:06:08
    高精度阶乘,10000的阶乘有35660位,对于Java中任何基本数据类型都不可能实现!故因想到用数组来存放结果。核心思路就是模拟手算的过程。 public class MyFactorial { public static void main(String[] args) { /...
  • 试题 基础练习 高精度加法 问题描述 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。  ...
  • 蓝桥杯-阶乘运算和高精度加法 因为我感觉这两种题型都是对高精度的考察,都可以用数组代替整形进行数字运算,所以我把这两种题型放在一起了。 阶乘运算 先看一下题目 解这种题目目前我知道的有两种解题思路: 第一...
  • N的阶乘 ... 解题思路Java大数类:BigInteger方法 代码如下: import java.math.BigInteger; import java.util.Scanner;... public static BigInteger jc(int n) { //计算阶乘 BigInteger s = BigInteger.ONE
  • 阶乘计算

    2020-01-29 15:19:53
    阶乘计算 问题描述  输入一个正整数n,输出n!的值。  其中n!=123*…*n。 算法描述  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A...
  • 蓝桥杯_阶乘计算

    2018-12-30 19:35:15
    可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • ACM 阶乘之和

    2021-05-22 01:42:02
    【ACM 阶乘之和】的更多相关文章阶乘之和 时间限制:3000ms | 内存限制:65535KB 难度:3 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则...
  • 可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意...
  • 模拟与高精度算法

    2021-03-07 17:27:13
    模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时间的。 技巧。写模拟题时,遵循以下的建议有可能会提升做题速度: 在动手写代码之前,在...
  • 高精度的数字计算他一直困扰着我,实际问题中有哪么大的数吗?你就不仅要加、还要乘、更要阶乘,还要算**100!**臣妾做不到,我做不到啊!你干嘛要超过int,干嘛要超过long。哈!笑话就从这儿结束吧。 思路思路:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 386
精华内容 154
关键字:

高精度阶乘计算思路java

java 订阅