编写一个java应用程序,求分数序列1⼀2,2⼀3,3⼀5,5⼀8,8⼀13,13⼀21,…的前10项之和。

2024-11-16 11:41:37
推荐回答(1个)
回答1:

我用一个最低级的方式实现了,希望可以抛砖引玉:

先讲一下我的思路:
不难发现这个数列的规律,第一个数的分子加第二个数的分子等于第三个数的分子,第一个数的分母加第二个分母等于第三个数的分母,后面的依次类推。

根据这个规律就可以很容易地得到数列中的第N个数;

剩下的问题就是求和。

如果只是简单的让计算机求一个和是不用动什么脑筋的,直接一个一个累加起来就可以了。但这样做的结果就是得不到最后的精确的结果。所以我这里求得的最后的和还是一个完整的分数,而不是以小数形式出现的。

那么利用义务教育所学的知识就知道,两个分数的和的分母,等于两个分数的分母的乘积,和的分子等于第一个分子乘以第二个分母,加上第一个分母乘以第二个分子。所以程序中有如下语句:

long[] rets = getSub(num1 * den2 + num2 * den1, den1 * den2);

getSub()方法求得的结果是约分之后的一个分数。具体的情况可以看程序中的注释。

于是在一个循环中,一边求得数列中的下一个分数,一边用这个语句累加到和,最后就可以得到想要的结果。
======================
package com.yydragon.ltjavatest.testmainfirst;

/**
* 编写一个java应用程序,求分数序列1/2,2/3,3/5,5/8,8/13,13/21,… 的前10项之和。
*
* @author Will
*
*/
public class TestClassTwo {
public static void main(String[] args) {
long num1 = 1; // 第一个分数的分子
long den1 = 2; // 第一个分数的分母
long num2 = 2; // 第一个分数的分子
long den2 = 3; // 第一个分数的分母

// 先求得前两项之和
System.out.print(num1 + "/" + den1 + " + " + num2 + "/" + den2);
long[] rets = getSub(num1 * den2 + num2 * den1, den1 * den2);
long numOfSum = rets[0]; // 最后求得的和的分子
long denOfSum = rets[1]; // 最后求得的和的分母

int interCount = 10; // 求前几项之和

// 从第三项开始循环,求和
for (int i = 2; i < interCount; i++) {
long num3 = num1 + num2;
long den3 = den1 + den2;
System.out.print(" + " + num3 + "/" + den3);
rets = getSub(num3 * denOfSum + numOfSum * den3, den3 * denOfSum);

num1 = num2;
den1 = den2;
num2 = num3;
den2 = den3;
}

System.out.println(" = " + numOfSum + "/" + denOfSum);
}

/**
* 将两个数同时除以它们的最大公约数,将得到的商以数组形式返回。
*
* @param num
* @param den
* @return
*/
public static long[] getSub(long num, long den) {
long maxCommonDivisor = getMaxCommonDivisor(num, den);
long numret = num / maxCommonDivisor;
long denret = den / maxCommonDivisor;

return new long[]{numret, denret};
}

/**
* 获取两个数的最大公约数。
*
* @param n1
* @param n2
* @return
*/
public static long getMaxCommonDivisor(long n1, long n2) {
long result = 1;
long maxer = Math.min(n1, n2);

for (int i = 1; i < maxer; i++) {
if (0==n1%i && 0==n2%i) {
result = i;
}
}

return result;
}
}