【NYOJ】[65]另一种阶乘问题

这里写图片描述

因为涉及到很多重复计算
所以用了打表法

#include<stdio.h>
int main() {
    int a[25]= {0};
    int sum[25]= {0};
    for(int i=1; i<=22; i++) {
        if(i==1) {
            a[1]=1;
            continue;
        }
        if(i&1) {
            a[i]+=a[i-1]*i;
        } else
            a[i]=a[i-1];
    }
    for(int i=1; i<=22; i++) {
        if(i==1) {
            sum[i]=a[i];
            continue;
        }
        sum[i]+=sum[i-1]+a[i];
    }
    int T;
    scanf("%d",&T);
    while(T--) {
        int m;
        scanf("%d",&m);
        printf("%d
",sum[m]);
    }
    return 0;
}

标程用了另一种打表
也就是通过一个程序先算出来各个数据
然后实际运行时便可以缩短运行时间

运行的程序的阶乘是通过递归函数算的
也是很巧妙
我现在也有些缺乏使用这些写法的意识

/*
#include<iostream>
using namespace std;
int f(int n)
{
    if(n%2) return n==1?1:n*f(n-2);
    return f(n-1);
}
int g(int n)
{
    return n?g(n-1)+f(n):0;
}
int main()
{
    int n,m;
    cin>>n;
    while(n--)
    {
        cin>>m;
        cout<<g(m)<<endl;
    }
}*/
#include<iostream>
using namespace std;
int main() {
    int n,m,r[]= {0,1,2,5,8,23,38,143,248,1193,2138,12533,22928,158063,293198,2320223,4347248,38806673,73266098,727995173,1382724248};
    cin>>n;
    while(n--) {
        cin>>m;
        cout<<r[m]<<endl;
    }
}

题目地址:【NYOJ】[65]另一种阶乘问题

原文地址:https://www.cnblogs.com/BoilTask/p/12569878.html