学生课后作业请自行完成。。
不过还是帮你写了一下仅供参考,考虑到是分数求和,为了不失精度,不能直接算出分数的值出来。需要用分式的加法公式,即求分母的最小公倍数,再将各自分子乘以一个数再加起来。
一开始以为整形就够了,后面执行才发现原来这个数字很大,整形会溢出,遂改为long型。
先看下执行结果
Fs是封装的分数对象,fenzi为分子的值,fenmu为分母的值,所以最终算的前30项和的大小就是
fenzi/fenmu, 数字太大就不打出来了。结果在上面截图。
下面是代码
主程序Test1.java
/**
* 用java求出数列2/1,3/2,5/3,8/5,13/......前30项和是多少?
* 求解
*
* @authorrensong.pu
* @date2019/11/22 10:32 星期五
**/
public class Test1 {
public static void main(String[] args) {
int fenzi = 2;
int fenmu = 1;
int tmp;
Fs sum = new Fs(0, 1);
for (int i = 0; i < 30; i++) {
Fs fe = new Fs(fenzi, fenmu);
System.out.println(fe);
sum = sum.add(fe);
tmp = fenzi;
fenzi = fenzi + fenmu;
fenmu = tmp;
}
System.out.println("前30项和:" + sum);
}
}
public class Fs {
long numerator; // 分子
long denominator; // 分母
Fs() {
}
Fs(long a, long b) {
if (a == 0) {
numerator = 0;
denominator = 1;
} else {
setNumeratorAndDenominator(a, b);
}
}
void setNumeratorAndDenominator(long a, long b) { // 设置分子和分母
long c = f(Math.abs(a), Math.abs(b)); // 计算最大公约数
numerator = a / c;
denominator = b / c;
if (numerator < 0 && denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
}
long getNumerator() {
return numerator;
}
long getDenominator() {
return denominator;
}
long f(long a, long b) { // 求a和b的最大公约数
if (a < b) {
long c = a;
a = b;
b = c;
}
long r = a % b;
while (r != 0) {
a = b;
b = r;
;
r = a % b;
}
return b;
}
Fs add(Fs r) { // 加法运算
long a = r.getNumerator();
long b = r.getDenominator();
long newNumerator = numerator * b + denominator * a;
long newDenominator = denominator * b;
Fs result = new Fs(newNumerator, newDenominator);
return result;
}
@Override
public String toString() {
return "Fs{" +
"fenzi=" + numerator +
", fenmu=" + denominator +
'}';
}
}
码字不易,求赞><