大数的阶乘

直接上代码:

C语言:

#include <stdio.h>
#include <time.h>

//给计算结果一个数组,并指定大小为4096
//第一次写程序使用的字符串保存大数,但是有个问题,需要char到int来回转换,影响计算性能。
//所以使用数组来保存数据,方便计算
int jieguo[40960] = {0};

//数组长度
int len = 0;

//fac为计算阶乘的函数,计算结果存储在jieguo[4096]数组中
int fac(int n)
{
	int v = 0;
	int f = 0;

	//初始化jieguo数组和数组长度
	jieguo[0] = 1;
	len = 1;

	for(int i = 1; i <= n; i++)
	{
		for(int j = len - 1; j >= 0; j--)
		{
			v = i * jieguo[j];
			jieguo[j] = v % 10;
			v = v / 10;

			f = j + 1;

			//如果v大于0,说明还要进位,所以将进位的数加上原来的数,判断进位后存储。
			//为了提高效率,使用for进行循环
			for(; v > 0 && f < len; f++)
			{
				v = v + jieguo[f];
				jieguo[f] = v % 10;
				v = v / 10;
			}
			
			//如果这时f等于数组的长度len并且v还大于0,说明需要增加jieguo数组的长度
			//为了提高效率,仍然使用for进行循环
			for(; v > 0;)
			{
				jieguo[len] = v % 10;
				v = v / 10;
				len++;
				
				if(len > 40960 - 2)
				{
					//这个时候说明数组长度不够,需要增加jieguo后面的数值
					//计算100的阶乘的数组长度为158,计算1000的阶乘的数组长度为2568。
					//可以根据实际需要进行设置。
					return 1;
				}
			}
		}		
	}
	return 0;
}

//下面写主函数
int main(void)
{
	int num;
	printf("请输入需要计算阶乘的数字:");
	scanf("%d", &num);
	
	//计算阶乘结果
	int r = fac(num);
	//如果返回1,则说明数组长度不够,需要增加长度
	if(r == 1)
	{
		printf("计算结果太大,请增加数组长度!\n");
		return 0;
	}
	printf("%d的阶乘为:", num);
	for(int i = len - 1; i >= 0; i--)
	{
		printf("%d", jieguo[i]);
	}
	printf("\n");
	printf("%d\n", len);
	printf("运行时间:%.2lf秒\n", (double)clock() / CLOCKS_PER_SEC);
	printf("\n");
	return 0;	
}

golang:

package main

import "fmt"
import "time"

const m int = 40960

func fac(n int) ([m]int, int) {
	var jieguo [m]int
	var len int
	var v, f = 0, 0

	jieguo[0] = 1
	len = 1
	
	for i := 1; i <= n; i++{
		for j := len - 1; j >= 0; j--{
			v = i * jieguo[j]
			jieguo[j] = v % 10
			v = v / 10 
			
			f = j + 1

			for ; v > 0 && f < len; f++ {
				v = v + jieguo[f]
				jieguo[f] = v % 10
				v = v / 10
			}

			for ; v > 0; len++ {
				jieguo[len] = v % 10
				v = v / 10
				
				if len > m - 2 {
					fmt.Println("error!")
					return jieguo, len
				}
			}
		}
	}
	return jieguo, len
}

func main() {
	a := 10000
	startTime := time.Now()
	f, len := fac(a)
	fmt.Printf("%d的阶乘为:", a)
	for i := len - 1; i >= 0; i-- {
		fmt.Print(f[i])
	}
	fmt.Print("\n")
	fmt.Println(len)
	
	t := time.Since(startTime)
    fmt.Println(t.Seconds())
}