大数的阶乘

38   /   0   /   0   /   0   /   发布于 1年前
直接上代码: ## C语言: ``` #include <stdio.h> #include <time.h> //给计算结果一个数组,并指定大小为4096 //第一次写程序使用的字符串保存大数,但是有个问题,需要char到int来回转换,影响计算性能。 //所以使用数组来保存数据,方便计算 int jieguo[4096] = {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 > 4096 - 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 = 4096 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()) } ```
  • 共 0 条回复
  • 需要登录 后方可回复, 如果你还没有账号请点击这里注册
梦初醒 茅塞开
  • 不经他人苦,莫劝他人善。
  • 能量足,心态稳,温和坚定可以忍。
  • 辛苦决定不了收入,真正决定收入的只有一个,就是不可替代性。
  • 要么忙于生存,要么赶紧去死!
  • 内心强大到混蛋,比什么都好!
  • 规范流程比制定制度更重要!
  • 立志需要高远,但不能急功近利;
    行动需要迅速,却不可贪图速成。
  • 不要强求人品,要设计高效的机制。
  • 你弱的时候,身边都是鸡零狗碎;
    你强的时候,身边都是风和日丽。
  • 机制比人品更可靠,契约比感情更可靠。
  • 合作不意味着没有冲突,却是控制冲突的最好方法。
  • 误解是人生常态,理解本是稀缺的例外。
  • 成功和不成功之间,只差一次坚持!
  • 祁连卧北雪,大漠壮雄关。
  • 利益顺序,过程公开,机会均等,付出回报。