最近老师布置了一个作业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,一下子就快起来了。