1. ACM试题题源:http://acm.nyist.net/JudgeOnline/problem.php?pid=65
描述
大家都知道阶乘这个概念,举个简单的例子: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
2. 代码
我的代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //运行时间:25ms 内存:184 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args){ 7 8 Scanner cin = new Scanner(System.in); 9 int a = cin.nextInt(); 10 int[] re = new int[a]; 11 int[] tenNum = new int[10]; 12 for(int i = 0; i < 10; i++){ 13 if(i == 0){ 14 tenNum[i] = 1; 15 }else if(i == 1){ 16 tenNum[i] = 3; 17 }else{ 18 tenNum[i] = tenNum[i-1] * (i*2+1); 19 } 20 } 21 for(int i = 0; i < a; i++){ 22 int n = cin.nextInt(); 23 re[i] = 0; 24 if(n%2==0){ 25 for(int j = 0; j < n/2; j++){ 26 re[i] = re[i] + tenNum[j]; 27 } 28 re[i] = re[i] * 2; 29 }else{ 30 for(int j = 0; j < (n+1)/2; j++){ 31 re[i] = re[i] + tenNum[j]; 32 } 33 re[i] = re[i] * 2 - tenNum[(n+1)/2-1]; 34 } 35 } 36 37 for(int i = 0; i < a; i++){ 38 System.out.println(re[i]); 39 } 40 cin.close(); 41 } 42 }
参考代码1
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //运行时间:1ms 内存:122 2 3 public class Main{ 4 5 public static int parseInt(String s){ 6 int i, value, multi=10; 7 8 value = s.charAt(s.length()-1) - 48; 9 for(i=s.length()-2; i>=0; i--){ 10 value += (s.charAt(i) - 48) * multi; 11 multi*=10; 12 } 13 14 return value; 15 } 16 17 public static void main(String args[])throws java.io.IOException{ 18 java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); 19 java.io.BufferedWriter bw = new java.io.BufferedWriter(new java.io.OutputStreamWriter(System.out)); 20 StringBuilder result = new StringBuilder(""); 21 String s; 22 int i, j, a, n; 23 long sum=0, tmp=0; 24 25 while((s=br.readLine())!=null){ 26 a = parseInt(s); 27 28 while(a-->0){ 29 n = parseInt(br.readLine()); 30 sum=0; 31 tmp=1; 32 33 for(i=1; i<=n; i++){ 34 for(j=1; j<=i; j+=2){ 35 tmp*=j; 36 } 37 sum+=tmp; 38 tmp=1; 39 } 40 41 result.append(sum).append("\n"); 42 } 43 44 bw.write(result.toString()); 45 bw.flush(); 46 result.setLength(0); 47 } 48 } 49 }
参考代码2
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 //运行时间:2 内存:61 2 3 import java.util.Scanner; 4 5 public class Main { 6 7 private static Scanner input = new Scanner(System.in); 8 public static void main(String[] args) { 9 int t = input.nextInt(); 10 while (t-- != 0) { 11 int n = input.nextInt(); 12 int sum = 0; 13 for (int i = 1; i < n+1; i++) { 14 sum += jiechen(i); 15 } 16 System.out.println(sum); 17 } 18 } 19 private static int jiechen(int i) { 20 int sum = 1; 21 for (int j = 1; j < i+1; j += 2) { 22 sum *= j; 23 } 24 return sum; 25 } 26 }
3. 总结
不难看出别人的代码不论是在时空复杂度还是在代码的易阅读性上面,都很健壮。而我的就很一般化了,还有要学习别人引用包后的使用方式,变量定义的方式,要学会把问题子问题化。