• 快速求N!


    快速求N的阶乘

    最近老师布置了一个作业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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    #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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    最后发现控制台一打印就寄了,改成输出到文本就可以看了,具体加

    1.exe >1.txt
    
    • 1

    最后发现一牛人,优化到0.014s

    https://www.emath.ac.cn/algorithm/factorial.htm

    这里是挑出 2和5 补0,一下子就快起来了。

  • 相关阅读:
    IPv6 中 MAC 33:33 的由来
    分库分表的 21 条法则,hold 住!
    Redis从入门到精通
    毕设准备---Cookie,Session
    为何基于树的模型在表格型数据中能优于深度学习?
    cpp11 return返回类对象的过程
    基于hough变换的多个重叠圆检测matlab仿真
    企业微信把人移出会有显示吗?如何移出?
    进程和线程有什么区别?
    LayUI使用(二)处理表格会出现下拉框的问题
  • 原文地址:https://blog.csdn.net/a257131460266666/article/details/128107118