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

文章字数:284

问题描述

问题分析

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

 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
#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;
}

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

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

 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
/*
#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;
	}
}

题目地址:另一种阶乘问题

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...