Loading

大数阶乘

先上代码

点击此处查看代码
#include<stdio.h>
#define N 10000
    long s[N]={1},n=10000,t=2,a,b,m;
    int main(void){
        for(;a<=m||++t<=N && (a=b=0,1); m==a++ && b && m++)
            s[a] = (b+=s[a]*t) % n , b/=n;
        for(printf("%d",s[m]);m--;)
            printf("%04d",s[m]);
        }

这段代码在调用time记录时间的情况下,计算10000的阶乘只需要1s,当然更精确的计算还是要调用线程来查看,这里只作一个粗略的估计,但是代码的写法是相当的精炼。


  • 算法思路:
    从2开始遍历到N,如果遇到数字超过1W就将其记录到数组中,确保每个单位数组都不超过1W。

  • 代码解读:
    对于需要计算的N,先初始化长度为N的long列表,每逢10000进一,初始化n为10000,在后面会进行取模操作,初始化t=2,定义a,b,m。
    在循环列表中,初始化a和b=0,循环条件是a≤m或者(t+1)≤N。循环之后判断m==a和b≠0是否同时成立,如果成立就m+1,并且a在每次循环都会加1。循环过程就是b累加s[a]*t,s[a]为b对n取余,最后格式化b为n的整数倍。
    当全部的数据都储存到了数组s中,并且因为是逢10000进1,因此在输出过程中只需要从大到小遍历数组s。

posted @ 2022-06-19 11:05  BGM_Bear  阅读(39)  评论(0)    收藏  举报