最近老师布置了一个作业1s内求20000!的阶乘
阶乘超过40
思路肯定就是数组,真正让我为难的是1s内。
最后想出来了一个勉强1s内。
开o2优化,x64
//#include"My_head.h"
#include
#include
#include
#include
#include //设定插入点
#include //字符处理
#include //定义错误码
#include //浮点数处理
#include //对应各种运算符的宏
#include //定义各种数据类型最值的常量
#include //定义本地化C函数
#include //定义数学函数
#include //异常处理支持
#include //信号机制支持
#include //不定参数列表支持
#include //常用常量
#include //定义输入/输出函数
#include //定义杂项函数及内存分配函数
#include //字符串处理
#include //定义关于时间的函数
#include //宽字符处理及输入/输出
#include //宽字符分类#pragma once
#include"My_head.h"long long maxsize;
long long nbitcount;
long long nbitcount1;
long long* init(long long n);
void mul(long long x, long long* s);
void print_arr(long long* s, long long x);int main()
{int begintime, endtime;long long* ps = NULL;long long n;printf("请输入一个非负数n\r\n");scanf("%lld", &n);begintime = clock();//计时开始if (n < 0){printf("输入错误,退出程序");exit(0);}if (n == 0)n = 1;ps = init(n);//根据n申请空间for (long long i = 1; i <= n; i++){mul(i, ps);}print_arr(ps, nbitcount);endtime = clock(); //计时结束printf("\n\nRunning Time:%dms\n", endtime - begintime);}void mul(long long x, long long* s)
{ long long temp = 0;for (long long i = maxsize-1; i >= nbitcount; i--){s[i] *= x;s[i] += temp;temp = s[i] / 100000000000000;s[i] = s[i] % 100000000000000;//记录实时位数,减少时间if (temp != 0){nbitcount1 = i - 1;if (nbitcount > nbitcount1){nbitcount = nbitcount1;}}}
}
long long* init(long long n)
{double nbitcount2 = 0;for (long long i = 1; i <= n; i++){nbitcount2 += (double)log10(i);}maxsize = ceil( ceil(nbitcount2) /14)+1;nbitcount1 = nbitcount = maxsize;nbitcount--;long long* ps = (long long*)malloc(sizeof(long long) * maxsize);for (long long i = 0; i
最后发现控制台一打印就寄了,改成输出到文本就可以看了,具体加
1.exe >1.txt
最后发现一牛人,优化到0.014s
https://www.emath.ac.cn/algorithm/factorial.htm
这里是挑出 2和5 补0,一下子就快起来了。