黑马程序员技术交流社区

标题: 难题 [打印本页]

作者: 2015竹林风    时间: 2015-11-7 14:21
标题: 难题
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
这道题的思想是什么,怎么做呢?

  

作者: 黑夜中那颗星    时间: 2015-11-7 16:05
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 ArrayList<Integer> al = new ArrayList<Integer>();
  4.                 for(int x = 1;x<=21;x++){
  5.                         if(x<3){
  6.                                 al.add(x);
  7.                         }
  8.                         else
  9.                                 al.add((al.get(x-3)+al.get(x-2)));
  10.                 }
  11.                 int sum = 0;
  12.                 for(int x = 1;x<al.size();x++){
  13.                         int i = al.get(x);
  14.                         int n = al.get(x-1);
  15.                         sum+=i/n;
  16.                         System.out.println(i+"/"+n+"="+(i/n));
  17.                        
  18.                 }
  19.                 System.out.println(sum);
  20.         }
  21. }
复制代码

作者: 森然    时间: 2015-11-7 19:13
代码能给全吗
作者: 小肥啾    时间: 2015-11-7 20:18
看除数和被除数 都是有规律的  可以作为两个数组,这个序列就是两个数组同样索引相除,就是这样了
作者: 小肥啾    时间: 2015-11-7 22:57

import java.util.Scanner;

public class Array_sum_double {

        /**
         * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
         */
        public static void main(String[] args) {
                System.out.println("请输入要求出多少个数的和:");
                Scanner sc = new Scanner(System.in);
                int num = sc.nextInt();
                System.out.print("除数为:\t\t");
                print_int(getNum_cs(num));
                System.out.println();
                System.out.print("被除数为:\t");
                print_int(getNum_bcs(num));
                System.out.println();
                System.out.print("数列为:\t\t");
                String[] str = num(num);        
                print_String(str);
                System.out.println();
                System.out.print("和为:\t\t");
                System.out.println(sum(num));

        }

        // 求除数和被除数的规律是 (1)(1)2 3 5 8 13 21……
        // 除数从2(索引2-第三个数)开始 被除数从1(索引1-第二个数)
        public static int getNum(int num) {

                if (num == 1) {
                        return 1;
                } else if (num == 2) {
                        return 1;
                } else if (num > 2) {
                        return (getNum(num - 1) + getNum(num - 2));
                } else {
                        return 0;
                }
        }

        // 求除数从索引2(第三个数) 开始
        public static int[] getNum_cs(int num) {
                int[] arr = new int[num];
                for (int i = 1; i <= num + 2; i++) { // 因为有两个数字 用不上
                                                                                                // 要往后跳两个,保证两个索引对应的数字刚好是除数和被除数
                        if (i >= 3) {
                                arr[i - 3] = getNum(i);
                        }
                }
                return arr;
        }

        // 求被除数从索引1 (第二个数) 开始
        public static int[] getNum_bcs(int num) {
                int[] arr = new int[num];
                for (int i = 1; i <= num + 1; i++) { // 因为有一个数字 用不上
                                                                                                // 要往后跳一个,保证两个索引对应的数字刚好是除数和被除数
                        if (i >= 2) {
                                arr[i - 2] = getNum(i);;
                        }
                }
                return arr;
        }

        //算出目标数组的结果
        public static double sum(int count) {
                int[] cs = getNum_cs(count);
                int[] bcs = getNum_bcs(count);
                double db = 0;
                for (int i = 0; i < count; i++) {
                        double d_cs = cs;
                        double d_bcs = bcs;
                        db += d_cs / d_bcs;
                }
                return db;
        }

        // 求出目标数结果的显示序列
        public static String[] num(int count) {
                int[] cs = getNum_cs(count);
                int[] bcs = getNum_bcs(count);
                String[] str = new String[count];
                for (int i = 0; i < count; i++) {
                        str = cs + "/" + bcs;
                }
                return str;
        }
        
        //数组整数打印
        public static void print_int(int[] arr) {
                System.out.print("[");
                for (int i = 0; i < arr.length; i++) {
                        if (i < arr.length - 1) {
                                System.out.print(arr + "\t");
                        }else {
                                System.out.print(arr);
                        }
                }
                System.out.print("]");
        }
        
        //打印字符串数组
        public static void print_String(String[] str) {
                //System.out.print("[");
                for (int i = 0; i < str.length; i++) {
                        if (i < str.length - 1) {
                                System.out.print(str + "\t");
                        }else {
                                System.out.print(str);
                        }
                }
                //System.out.print("]");
        }
        
}


作者: 黑夜中那颗星    时间: 2015-11-7 23:09
森然 发表于 2015-11-7 19:13
代码能给全吗

导包没有复制进去,在最上面加上    import java.util.*;
作者: 小肥啾    时间: 2015-11-7 23:27
黑夜中那颗星 发表于 2015-11-7 16:05

这个溜   都不用数组在来麻烦了
作者: ash午夜阳光    时间: 2015-11-7 23:47
本帖最后由 ash午夜阳光 于 2015-11-8 08:00 编辑

package generic;

public class XXXXX {
        public static void main(String[] args) {
                for (int i = 1; i <= 20; i++) {
                        System.out.print(getFenZi(i)+"  ");
               
                }
                System.out.println();
                for (int i = 1; i <= 20; i++) {
               
                        System.out.print(getFenMu(i)+"  ");
                }
                System.out.print(getSum(20));
               
        }

        public static int getSum(int n) {
                int sum = 0;
                for (int i = 1; i <= n; i++) {
                        sum += getFenZi(i) / getFenMu(i);
                }
                return sum;
        }

        public static int getFenMu(int n) {
                if (n == -1) {
                        return 0;
                } else if (n == 0) {
                        return 1;
                } else
                        return getFenMu(n - 1) + getFenMu(n - 2);
        }
        public static int getFenZi(int n){
                if (n == -1) {
                        return 1;
                } else if (n == 0) {
                        return 1;
                } else
                        return getFenZi(n - 1) + getFenZi(n - 2);
               
        }

}

作者: 2015竹林风    时间: 2015-11-8 18:37
黑夜中那颗星 发表于 2015-11-7 16:05

谢谢,非常感谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2