目录
1、兔子繁殖问题
2、101-200之间的素数
3、水仙花
4、正整数分解成质因数
4、简化版本(原网址:https://blog.csdn.net/Purnell/article/details/78209757)
5、给成绩分等级
6、最大公约数和公倍数
7、字符统计
8、求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字
9、完数
10、球落地反弹
11、1~4组成3位数
12、利润提成
13、完全平方数
14、根据日期判断是这年的哪一天
15、3个整数比较大小
16、乘法表
17、猴子吃桃子
18、比赛名单
19、菱形
20、分数相加(后面运行数度很慢,数值很大)
package woniu.java50; import java.util.Scanner; /*Java50例题 * 1、兔子繁殖问题--斐波那契数列 * 条件:1对兔子出生第3个月后开始繁殖,2月后一月一次1对,不死 * 分析兔子的对数呈现为:1、1、2、3、5、8、13、21*/ public class T_1_tuzi { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入兔子繁殖的时间(单位:月,类型整数):"); int month = scanner.nextInt(); while (month <= 0) { System.out.println("输入不合法,请重新输入:"); month = scanner.nextInt(); } int pre = fanzhi(month); System.out.println(month+"个月后,兔子的对数为:"+pre+"对"); scanner.close(); } private static int fanzhi(int month) { // TODO Auto-generated method stub int pre_1=1,pre_2=1; int pre_n = 0; if (month ==1 || month ==2) { pre_n = 1; }else { for (int i = 3; i <= month; i++) { pre_n = pre_1+pre_2; pre_1 = pre_2; pre_2 = pre_n; } } return pre_n; } }
package woniu.java50; /*判断101-200之间有多少个素数,并输出所有素数 *素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数 * */ public class T_2_shusu { public static void main(String[] args) { int s=0;//素数个数 for (int i = 101; i < 201; i++) { int k = 0; int data[] = new int[30];//定义一个数组,长度为20 // 判断素数并存入数组 for (int j = 1; j <= i; j++) { if (i%j == 0) { while (true) { data[k] = j; k++; // 跳出while循环 break; } } } // 查看数组元素 /* * System.out.println(i+"的因数数组为:"); for (int j = 0; j < k; j++) * System.out.print(data[j]+" "); System.out.println(); */ // 判断素数 if (k == 2) { System.out.println(i+"是素数"); s++; // 查看因数数组 /* * for (int j = 0; j < k; j++) System.out.print(data[j]+" "); * System.out.println(); */ } } System.out.println("101--200之间一共有"+s+"个素数"); } }
package woniu.java50; /** * 3、打印水仙花数 * @author 26307 *水仙花数:3位数,其每一位数的立方和等于其本身 *范围:100-999 */ public class T_3_shuixianhuashu { public static void main(String[] args) { for (int i = 100; i < 1000; i++) { panduan(i); } } private static void panduan(int num) { // TODO Auto-generated method stub int bai = num/100; //百位数 int shi = num/10%10; //十位数 int ge = num%10; //个位数 if (num == bai*bai*bai + shi*shi*shi + ge*ge*ge) { System.out.println(num+"是水仙花数!"); } } }
package woniu.java50; import java.util.Scanner; /** * 将一个正整数分解质因数 * @author 26307 *eg:90=2*3*3*5 *条件: *1、可以被整除,除数是素数 *2、循环除,直到成为一个素数 *素数:只有1和本身两个因子 *不是:奇数1、偶数(2除外) * */ public class T_4_zhishu { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个正整数:"); int num = scanner.nextInt(); int a = num; while (num < 0) { System.err.println("您输入的是负数,请重新输入一个正整数:"); num = scanner.nextInt(); a = num; } int[] arr = new int[11]; int key = 0; for (int i = 2; i <= num; i++) { if (num%i==0 && sushu(i)) { num = num/i; arr[key] = i; key++; i = 1; } } // 输入的整数为1或者为素数 if (a==1 || sushu(a)) { System.out.println(a+" = "+ a + " * "+" 1 "); // 退出程序 System.exit(0); } // 规范输出 System.out.print(a+" = "); for (int i = 0; i < key; i++) { // 输出前面的质因数 if (i< key-1) { System.out.print(arr[i]+" * "); // 结束当前循环进入下次循环 continue; } // 最后一个质因数 if (i == key-1) { System.out.print(arr[i]); } } scanner.close(); } // 判断素数 @SuppressWarnings("unused") public static boolean sushu(int num) { // TODO Auto-generated method stub if (num==2 ) { // System.out.println(num+"是素数!"); return true; // 排除偶数和1(素数必须>0) }else if (num%2==0 || num < 2) { // System.out.println(num+"不是素数!"); return false; }else { // 定理: 如果n不是素数, 则n有满足1< d<=sqrt(n)的一个因子d. // 证明: 如果n不是素数, 则由定义n有一个因子d满足1< d< n. for (int i = 3; i*i <= num; i += 2) { // i+=2:排除偶数 if (num%i == 0) { // System.out.println(num+"不是素数!"); return false; } // System.out.println(num+"是素数!"); return true; } } // System.out.println(num+"是素数!"); return true; } }
package woniu.java50; /** * 不用考虑素数,在方法f中已经规避了对素数的判定 */ import java.util.Scanner; public class T_4_primeNum { public static int f(int n) { for (int i = 2; i < n; i++) { if (n%i==0 && n!=i) { System.out.print(i+" * "); return f(n/i); } } System.out.print(n); return n; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个正整数:"); int n = scanner.nextInt(); System.out.print(n+" = "); f(n); scanner.close(); } }
package woniu.java50; import java.util.Scanner; /** * 给输入的成绩分等级 * @author 26307 *A:>=90 *B:89-60 *C:<60 *Java默认整除 */ public class T_5_score { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入您的分数(0~100):"); int score = scanner.nextInt(); while (score>100 || score<0) { System.err.println("输入错误,请重新输入百分制的分数:"); score = scanner.nextInt(); } switch (score/30) { case 1: case 0: System.out.println("您的等级是C"); break; case 2: System.out.println("您的等级是B"); break; case 3: System.out.println("您的等级是D"); break; default: break; } scanner.close(); } }
package woniu.java50; import java.util.Scanner; /** * 输入两个正整数找到他们最大公约数和最小公倍数 * @author 26307 *公约数:整除两个整数的最大正整数common divisor *公倍数:2个整数的共有倍数(第一个可以整除两个整数的正整数)Common multiple */ public class T_6_mathBeiUYue { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入两个整数:"); int a = scanner.nextInt(); int b = scanner.nextInt(); while (a<=0 || b<=0) { if (a<=0) { System.err.println("第一个数输入错误,请重新输入一个正整数:"); a = scanner.nextInt(); } if (b<=0) { System.err.println("第二个数输入错误,请重新输入一个正整数:"); b = scanner.nextInt(); } } int min = commonMultipleMin(a, b); int max = commonDivisorMax(a, b); System.out.println(a+"和"+b+"的最小公倍数是:"+min+",最大公约数是:"+max); scanner.close(); } //最小公倍数Common multiple public static int commonMultipleMin(int a,int b) { int max = a>b?a:b; int min = max; for (int i = max; i <= a*b; i++) { if (i%a==0 && i%b==0) { min = i; break; } } return min; } // 最大公约数common divisor public static int commonDivisorMax(int a,int b) { int min = a<b?a:b; int max = 1; for (int i = 2; i < min; i++) { if (a%i==0 && b%i==0) { max = max>i?max:i; } } return max; } }
package woniu.java50; import java.util.Scanner; /*统计字符个数 * 描述:输出一行字符,分别统计其英文字母、空格、数字和其他字符的个数 * charAt(): * */ public class T_7_characterStatistical { // 函数中的void表示return返回的数据类型,其中void表示空 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一行字符串,回车结束输入:"); String str = scanner.nextLine(); tongji(str); scanner.close(); } private static void tongji(String str) { int china = 0; int english = 0; int number = 0; int blank = 0; int other = 0; for (int i = 0; i < str.length(); i++) { // 缓存字符 char ch = str.charAt(i); // Unicode表中:中文基础范围:'\u4E00'--'\u9FA5 if (ch >= '\u4E00' && ch <= '\u9FA5') { china++; } // 统计英文字母 else if (ch >= 'a' && ch <= 'z'||ch >= 'A' && ch <= 'Z') { english++; // 数字 }else if (ch >= '0' && ch <= '9') { number++; // 空格,ASCII码为32 }else if (ch == ' ') { blank++; // 其他 }else { other++; } } System.out.println("中文字符有:"+china+"个,英文字母有:"+english+"个,数字有:"+number+"个,空格有:"+blank+"个,其他字符有:"+other+"个"); return; } }
package woniu.java50; import java.util.Scanner; /** * 求解:s = a + aa + aaa + aaaa + aaaaa + ??? * 加多少由用户设定 * @author 26307 * */ public class T_8_sum5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数(1-9):"); int num = scanner.nextInt(); while (num <= 0 || num > 9 ) { System.err.println("第一个数输入错误,请重新输入1-9内的一个整数:"); num = scanner.nextInt(); } System.out.println("请输入需要相加的数的最大位数(不超过9):"); int n = scanner.nextInt(); while ( n<= 0 || n>9) { System.err.println("第二个数输入错误,请重新输入1-9内的一个整数:"); n = scanner.nextInt(); } System.out.println(sum(num,n)); scanner.close(); } public static int sum(int a,int b) { int s = 0; int result = 0; System.out.print("s = "); for (int i = 0; i < b; i++) { s = s * 10 + a; result += s; if (i<b-1) { System.out.print(s+" + "); continue; } System.out.println(s); System.out.print(" = "); } return result; } }
随机版
package woniu.java50; import MyShortcuts.Random; /** * 求解:s = a + aa + aaa + aaaa + aaaaa + ??? * 加多少由随机设定 * @author 26307 * */ public class T_8_randomSum { public static void main(String[] args) { int num = Random.randomNuber(1, 9); System.out.println("初始数据是:"+num); int n = Random.randomNuber(1, 9); System.out.println("最大位数是:"+n); System.out.println(sum(num,n)); } public static int sum(int a,int b) { int s = 0; int result = 0; System.out.print("s = "); for (int i = 0; i < b; i++) { s = s * 10 + a; result += s; if (i<b-1) { System.out.print(s+" + "); continue; } System.out.println(s); System.out.print(" = "); } return result; } }
随机函数
package MyShortcuts; /** * 随机生成指定范围的一个随机整数 * @author 26307 * */ public class Random { // 随机一个数在指定范围内[a,b],a<b // 调用eg : Random.randomNuber(11, 30) public static int randomNuber (int a,int b) { // 向上取整:范围会变小,即[a,b]-->[a+1,b] // 向下取整 int num = (int)Math.floor(Math.random()*(b-a+1)+a); return num; } }
package woniu.java50; /** *描述: *一个数如果恰好等于它的因子之和,这个数就称为”完数”。 *例如6=1+2+3.编程 找出1000以内的所有完数 * @author 26307 *求因子:可以整除 *求和:数组长度未知,相加,求和 */ public class T_9_wanMeiShu { public static void main(String[] args) { for (int i = 1; i < 1000; i++) { if (i == sum(yinzi(i))) { show(i, yinzi(i)); } } } // 求因子 public static int[] yinzi(int a) { // 1000以内因子最多的是840,有32个因子(包含840) int[] arr = new int[31]; int k = 0; for (int i = 1; i < a; i++) { // 数组未赋值时存储的数据是0 if (a%i==0) { arr[k] = i; k++; } } return arr; } // 求和 public static int sum(int[] a) { int s = 0; for (int i = 0; i < a.length; i++) { if (a[i]==0) { break; } s += a[i]; } return s; } // 输出因子 public static void show(int a,int[] b) { System.out.print(a+" = "); for (int i = 0; i < b.length; i++) { if (b[i+1]==0) { System.out.print(b[i]); break; } // if (i!=0 && i%6==0) { // System.out.println(); // System.out.print(" "); // } System.out.print(b[i]+" + "); } System.out.println(); } }
package woniu.java50; import java.util.Scanner; /**题目描述: * 一球从100米高度自由落下,每次落地后反跳回原高度的一半; * 再落下,求它在 第10次落地时,共经过多少米? * 第10次反弹多高? * @author 26307 * 解决思路: * 1、h = h * 0.5,float * 2、函数调用本身 */ public class T_10_qiuFanTan { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入初始高度(单位:米,>=1):"); float h = scanner.nextFloat(); while (h < 1.0F) { System.err.println("输入错误,请重新输入初始高度(单位:米,>1):"); h = scanner.nextFloat(); } System.out.println("请输入反弹次数(>=1):"); int n = scanner.nextInt(); while (n < 1) { System.err.println("输入错误,请重新输入弹跳次数:"); n = scanner.nextInt(); } System.out.println("初始高度为"+h+"米时,第"+n+"次反弹高度是:"+tanQiu(h, n)+"米"); scanner.close(); } // 弹球 public static float tanQiu(float h,int n) { h = h/2.0F; n--; // System.out.println("n="+n+", h="+h); // 省略for循环 if (n>0) { return tanQiu(h, n); }else { return h; } } }
package woniu.java50; /**题目: * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数? * 都是多少? * * @author 26307 *解析: *4个数字1-4,3位数:3层for循环 */ public class T_11_numberZuHe { public static void main(String[] args) { int n = 1; for (int i = 1; i < 5; i++) { for (int j = 1; j < 5; j++) { for (int j2 = 1; j2 < 5; j2++) { if (i==j || i==j2 || j==j2) { continue; }else { System.out.println("第"+n+"个三位数是:"+i+j+j2); n++; } } } } } }
package woniu.java50; import java.util.Scanner; /**题目: * 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; * 利润高于10万元,低于20万元时,低于10万元的部分按10%提成, * 高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分, * 可提成5%;40万到60万之间时高于40万元的部分,可提成3%; * 60万到100万之间时,高于60万元的部分,可提成1.5%, * 高于100万元时,超过100万元的部分按1%提成, * 从键盘输入当月利润I,求应发放奖金总数? * * @author 26307 *解析: *1、用户输入利润 *2、根据利润判断得到奖金 *利润提成区间 *1、lr<=10w 0.1 lr*0.1 1 *2 10w<lr<=20W 0.075 (lr-10)*0.075+1 1+0.75 *3 20W<lr<=40w 0.05 (lr-20)*0.05+1.75 1.75+1 *4 40W<lr<=60w 0.03 (lr-40)*0.03+2.75 2.75+0.6 *5 60W<lr<=100w 0.015 (lr-60)*0.015+3.35 3.35+0.6 *6 100W<lr 0.01 (lr-100)*0.01+3.95 *拓展: *利润精确到6位小数 */ public class T_12_tiChen { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入本月利润(单位:万元):"); float lr = scanner.nextFloat(); while (lr<=0F) { System.err.println("利润不能为负数,请重新输入(单位:万元):"); lr = scanner.nextFloat(); } System.out.println("本月利润为"+lr+"万元,应发奖金"+tc(lr)+"万元"); scanner.close(); } // 提成 public static float tc(Float lr) { float jiangJin = 0F; // 100W<lr 0.01 (lr-100)*0.01+3.95 if (lr>100F) { jiangJin = (lr-100F) * 0.01F + 3.95F; } // 60W<lr<=100w 0.015 (lr-60)*0.015+3.35 3.35+0.6 if (lr>60F) { jiangJin = (lr-60F)*0.015F+3.35F; } // 40W<lr<=60w 0.03 (lr-40)*0.03+2.75 2.75+0.6 if (lr>40F) { jiangJin = (lr-40F)*0.03F+2.75F; } // 20W<lr<=40w 0.05 (lr-20)*0.05+1.75 1.75+1 if (lr>20F) { jiangJin = (lr-20F)*0.05F+1.75F; } // 10w<lr<=20W 0.075 (lr-10)*0.075+1 1+0.75 if (lr>10F) { jiangJin = (lr-10F)*0.075F+1F; } // lr<=10w 0.1 lr*0.1 1 if (lr<10F) { jiangJin = lr * 0.1F; } return jiangJin; } }
package woniu.java50; /**题目: * 一个整数,它加上100后是一个完全平方数, * 再加上168又是一个完全平方数,请问该数是多少? * @author 26307 *解析: *使用数学方法:math.sqrt()开平方 *回答:在int类型范围类只有3个满足该条件的数,即:21 261 1581 */ public class T_13_sqrt { public static void main(String[] args) { int number = 1; // 死循环,结束条件:得到三个满足条件的数 for (int i = 1;; i++) { if (number > 3) { // 程序停止 System.exit(0); } if (isSqrt(i)) { System.out.println("第"+number+"个满足条件的数是:"+i); number++; } } } public static boolean isSqrt(int n) { boolean result = false; int n1 = n+100; int n2 = n+268; int x = (int)Math.sqrt(n1); int y = (int)Math.sqrt(n2); if (x*x == n1 && y*y == n2) { result = true; } return result; } }
package woniu.java50; import java.util.Scanner; /** * 题目:输入某年某月某日,判断这一天是这一年的第几天? * @author 26307 * 分析: * 闰年:366天 2月29天 * 平年:365天 2月28天 * 31天: 1 3 5 7 8 10 12 * 30天: 4 6 9 11 * 函数: * 1、判断闰年 * 1)可以被4,但是不能被100整除 * 2)可以被400整除 * 2、得到天数 */ public class T_14_timeYearMonthDay { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入年份:"); int year = scanner.nextInt(); System.out.println("请输入月份:"); int mouth = scanner.nextInt(); System.out.println("请输入号数:"); int day = scanner.nextInt(); int dayNumber = dayNumber(year, mouth, day); System.out.println(year+"年"+mouth+"月"+day+"日是"+year+"年200的第"+dayNumber+"天"); scanner.close(); } // 判断闰年: public static boolean runYear(int year) { boolean result = false; if ((year%4==0 && year%100!=0) || year%400==0) { result = true; System.out.println(year+"是闰年"); }else { System.out.println(year+"不是闰年"); } return result; } // 得到天数 public static int dayNumber(int year, int mouth,int day) { int number = 0; if (runYear(year) && mouth>2) { number++; } switch (mouth) { case 1: number += day; break; case 2: number += day+31; break; case 3: number += day+31+28; break; case 4: number += day+31+28+31; break; case 5: number += day+31+28+31+30; break; case 6: number += day+31+28+31+30+31; break; case 7: number += day+31+28+31+30+31+30; break; case 8: number += day+31+28+31+30+31+30+31; break; case 9: number += day+31+28+31+30+31+30+31+31; break; case 10: number += day+31+28+31+30+31+30+31+31+30; break; case 11: number += day+31+28+31+30+31+30+31+31+30+31; break; case 12: number += day+31+28+31+30+31+30+31+31+30+31+30; break; default: break; } return number; } }
package woniu.java50; import java.util.Arrays; import java.util.Scanner; /** * 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 * @author 26307 * */ public class T_15_shuZiDaXiao { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] arr = new int[3]; // System.out.println("请输入3个整数(空格相隔,回车结束):"); // arr[0] = scanner.nextInt(); // arr[1] = scanner.nextInt(); // arr[2] = scanner.nextInt(); for (int i = 0; i < arr.length; i++) { System.out.println("请输入第"+(i+1)+"个整数"); arr[i] = scanner.nextInt(); } int[] arr2 = paiXu(arr); System.out.println(Arrays.toString(arr2)); scanner.close(); } // 排序 public static int[] paiXu(int[] arr) { // 比较轮数 for (int i = 0; i < arr.length-1; i++) { // 比较,升序 for (int j = 0; j < arr.length-i-1; j++) { if (arr[j] > arr[j+1]) { int max = arr[j]; arr[j] = arr[j+1]; arr[j+1] = max; } } } return arr; } }
package woniu.java50; /** * 输出9*9口诀 * @author 26307 * */ public class T_16_99chengFa { public static void main(String[] args) { for (int i = 1; i < 10; i++) { for (int j = 1; j < i+1; j++) { System.out.print(i+" * "+j+" = "+(i*j)); System.out.print(" "); } System.out.println(); } } }
package woniu.java50; /**题目: * 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半, * 还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半, * 又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。 * 到第10天早上想再吃时,见只剩下一个桃子了。 * 求第一天共摘了多少。 * @author 26307 * 分析: * 10天剩下1个 * 9:(1+1)*2 = n * 。。。:(n+1)*2 */ public class T_17_houZiChiTao { public static void main(String[] args) { int n = 1; for (int i = 10; i > 0; i--) { System.out.println("第"+i+"天桃子数量为:"+n); n = (n+1)*2; } } }
package woniu.java50; /** * 题目描述; * 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 * 已抽签决定比赛名单。有人向队员打听比赛的名单。 * a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 * @author 26307 *分析; *使用数组进行分组 *条件:a不和x比赛,c不和x\z比赛-即c只能和y比赛-a、b不能和y比赛 * *分析结果:a-z c-y b-x */ public class T_18_abcPKxyz { public static void main(String[] args) { String[] A = {"a","b","c"}; String[] B = {"x","y","z"}; String[][] pk = new String[3][2]; for (int i = 0; i < A.length; i++) { for (int j = 0; j < B.length; j++) { if ((A[i] =="a" && B[j] == "x") || (A[i] =="a" && B[j] == "y")) { continue; }else if ((A[i] == "c" && B[j]=="x") || (A[i] == "c" && B[j]=="z")) { continue; }else if ((A[i] =="b" && B[j] == pk[0][1])||(A[i] =="b" && B[j] == "y")) { continue; }else { pk[i][0] = A[i]; pk[i][1] = B[j]; } } } System.out.println("比赛名单:"); for (int i = 0; i < pk.length; i++) { System.out.println("第"+(i+1)+"组:"+pk[i][0]+" pk "+pk[i][1]); } } }
package woniu.java50; import java.util.Scanner; /** * 题目:打印菱形 * @author 26307 *分析:菱形 *行数h必须为奇数,列数l由行数决定 *最大列数l=h *中间行:zh = h/2 +1(整除) *1<= h <= zh,即中间行以上:l = 2*h -1 *hmax>= h >= zh,即中间行以下:l = 2*(h-2(h-zh))-1=2(2*zh-h)-1 */ public class T_19_lingxing { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int h = 1; System.out.println("请输入菱形的对角线长度:(默认为1)"); h = scanner.nextInt(); while (h<1 || h%2 == 0) { System.err.println("输入错误!对角线长度必须为大于0的奇数,请重新输入:"); h = scanner.nextInt(); } System.out.println("---------打印菱形-----------"); lingXing(h); scanner.close(); } private static void lingXing(int h) { int zh = h/2 +1; for (int i = 0; i <= h; i++) { if (i <= zh) { for (int j = 0; j < zh-i; j++) { System.out.print(" "); } for (int j = 0; j < 2*i-1; j++) { System.out.print(" *"); } }else { for (int j = 0; j < i-zh; j++) { System.out.print(" "); } for (int j = 0; j < 2*(2*zh-i)-1; j++) { System.out.print(" *"); } } System.out.println(); } } }
package woniu.java50; import java.util.Arrays; /** * 题目: * 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。 * @author 26307 *分析: *分子:2 3 5 8 13 *** :规律:从第三个数开始,一个数等于前两个数之和 *分母:1 2 3 5 8 **** :规律:从第三个数开始,一个数等于前两个数之和 *困难:分数相加 数值越界:int--long--double *解决:2个分子相加,在和第三个分子相加 * *后面数字较大,加到第11个分数已经达到10位数 */ public class T_20_fenShuJiaFa { public static void main(String[] args) { int[] a = new int[20]; int[] b = new int[20]; a = guiLv(2,3); b = guiLv(1,2); System.out.println("分子:"+Arrays.toString(a)+",长度"+a.length); System.out.println("分母:"+Arrays.toString(b)+",长度"+b.length); long[] result = new long[2]; result = addFenShu((long)a[0], a[1], (long)b[0], b[1]); for (int i = 2; i < a.length; i++) { result = addFenShu(result[0], a[i], result[1], b[i]); System.out.println("前"+(i+1)+"个分数相加结果:"+result[0]+"/"+result[1]); } // System.out.println(result[0]+"/"+result[1]); } // 分数相加 分子a,分母b private static long[] addFenShu(Long a1,int a2,Long b1,int b2) { long[] arr = new long[2]; // 找到公倍数 long gbs = minGBS(b1, b2); // 找到各自的倍数 long c1 = gbs/b1; long c2 = gbs/b2; // 相加的分子 long a3 = a1*c1+a2*c2; // 化简 long gys = maxGYS(a3, gbs); arr[0] = a3/gys; arr[1] = gbs/gys; return arr; } // 找最小公倍数 private static long minGBS(Long a,int b) { long c = 0; long max = a>b?a:b; long min = a<b?a:b; for (int i = 1; i <= min ; i++) { if ((max*i)%min != 0) { continue; }else { c = max*i; break; } } return c; } // 找最大公因数 private static long maxGYS(long a,Long b) { long c = 1; long min = a<b?a:b; for (long i = min; i > 0 ; i--) { if (a%i==0 && b%i==0) { c = i; break; }else { continue; } } return c; } // 规律数组 private static int[] guiLv(int a,int b) { // TODO Auto-generated method stub int[] array1 = new int[20]; array1[0] = a; array1[1] = b; for (int i = 2; i < 20; i++) { array1[i] = array1[i-1] + array1[i-2]; } return array1; } }