题目描述:题目链接
另一种阶乘问题
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
大家都知道阶乘这个概念,举个简单的例子:5!=1*2*3*4*5.现在我们引入一种新的阶乘概念,将原来的每个数相乘变为i不大于n的所有奇数相乘例如:5!!=1*3*5.现在明白现在这种阶乘的意思了吧!
现在你的任务是求出1!!+2!!......+n!!的正确值(n<=20)
-
输入
-
第一行输入一个a(a<=20),代表共有a组测试数据
接下来a行各行输入一个n.
输出
- 各行输出结果一个整数R表示1!!+2!!......+n!!的正确值 样例输入
-
2 3 5
样例输出
-
5 23
-
大致思路:
-
求解此题,可以发现一些规律。既相邻的两个数的阶乘是一样的,所以为了简单起见可以求解奇数的阶乘,将其结果保存在一个flag数组中,因此这个数组保存的即是1!!,3!!,5!!......这样的值。
-
然后整个求解可以分为两个步骤:单独求解flag[10]的值和根据题目信息求解阶乘和。
- 注:先求解出flag数组的所有值,优化算法。
-
代码求解:
-
package 语言入门; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /* * 另一种阶乘问题:5!!=1*3*5 * 求解n!!之和(n<=20) */ public class Num_65 { private static int[] flag=new int[11]; public static void main(String[] args) throws IOException { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); //求出flag数组中1!!,3!!,5!!...20!!阶乘的值 getFlag(flag,10); //输入 int count=getInt(in.readLine()); for(int i=0;i<count;i++) { int n=getInt(in.readLine()); //阶乘求和计算 int sum=0; for(int j=1;j<=n;j++) { if(j%2==0) sum=sum+flag[j/2]; else sum=sum+flag[j/2+1]; } //输出结果 System.out.println(sum); } } /* * 求解1-20中阶乘的值,由于n!!与(n-1)!!的阶乘相同【n为偶数时】 * 因此,这里的str数组长度只记n为奇数的情况 * 题目所给的长度为20,自定义为11,下标从1开始 */ private static int getFlag(int[] str, int n) { if(n==1) return str[n]=1; else { str[n]=getFlag(str, n-1)*(2*n-1); return str[n]; } } private static int getInt(String readLine) { return Integer.parseInt(readLine); } }
-
第一行输入一个a(a<=20),代表共有a组测试数据