大数的阶乘
直接上代码:
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())
}