因为涉及到很多重复计算
所以用了打表法
#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]另一种阶乘问题