• 大数运算之大数阶乘


    阶乘会使得位数增长的非常快,比如20!的值的位数就已经要突破long long的上限了。所以常规的做法是处理不了的,要通过数组的方式来处理。当然这个数字本身不能超过int的范围,并且要提前预估这个数字的阶乘会有多少位。

    以计算5的阶乘为例,来说明这个算法:

    STEP1
    初始化array[0] = 1

    STEP2
    从2开始乘,1*2 = 2,结果只有1位数,直接存到array[0]

    STEP3
    2*3 = 6,结果只有1位数,直接存到array[0]

    STEP4
    6*4 = 24,结果有2位数,2存到array[1],4存到array[0]

    STEP5
    24*4 = 120,结果有3位数,1存到array[2],2存到array[1],0存到array[0]

    代码实现:

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXLENGTH 50000
    int main()
    {
    	int n;
    	while(cin >> n)
    	{
    		int* array = NULL;
    		array = (int*)malloc(MAXLENGTH*sizeof(int));
    		if(!array)
    		{
    			cout << "malloc failed" << endl;
    			break;	
    		} 
    		else
    		{
    			array[0] = 1;
    			int digit = 1;//位数,随着计算不断更新 
    			for(int i = 2;i <= n;i++)
    			{
    				int temp;
    				int carry = 0;//进位 
    				for(int j = 0;j < digit;j++)//将一个数每一位都乘以i 
    				{
    					temp = array[j]*i+carry;
    					array[j] = temp%10;//将一个数的每一位拆开存放到数组的每一位 
    					carry = temp/10;
    				}
    				while(carry)
    				{
    					array[digit] = carry%10;
    					carry /= 10;
    					digit++;
    				}
    			}
    			while(digit >= 1) cout << array[--digit];//逆序输出 
    			cout << endl;
    		}
    		free(array);
    	}
    	return 0;
    } 
     
    

    以上的代码计算10000的阶乘没有问题

  • 相关阅读:
    tcp的三次握手和四次挥手
    前端文档规范
    阻止事件冒泡
    研发纠纷解决方案
    ui-router 中views的配置
    JXL操作Excel部分详解(java)
    utf-8与utf-16的区别
    把字符串转换为Double 类型
    spring MVC
    Android项目目录结构
  • 原文地址:https://www.cnblogs.com/multhree/p/10666473.html
Copyright © 2020-2023  润新知