GitBook

这里写图片描述

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

#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\n",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]另一种阶乘问题