需求分析:
概要设计:
详细设计:
编码及单元测试:
数列:
package sequence;
public abstract class Sequence {
/**
* 返回数列第n项
*/
protected abstract double getAn(int n);
/**
* 计算数列前n项和
*/
public double getSum(int n) {
double sum=0.0;
for(int i=1;i<n;i++)
sum+=getAn(i);
return sum;
}
}
等差数列:
package sequence;
public class ArithmeticSequence extends Sequence {
// 首项
private double a1 = 0;
// 公差
private double d = 0;
public ArithmeticSequence(double a1, double d) {
this.a1=a1;
this.d=d;
}
public ArithmeticSequence(double am, int m, double an, int n) throws Exception {
if(m==n)
throw new Exception("两项应为不同项");
else{
d=(an-am)/(n-m);
a1=an+(1-n)*d;
}
}
/**
* 计算数列前n项和
*/
@Override
public double getSum(int n) {
return n*a1+n*(n-1)*d/2;
}
/**
* 返回数列第n项
*/
@Override
public double getAn(int n) {
return a1+(n-1)*d;
}
}
等比数列:
package sequence;
public class GeometricSquence extends Sequence {
//精度设置
public static double PRECISION=0.0000001;
//首项
private double a1=1;
//公比
private double q=1;
public GeometricSquence(double a1, double q) throws Exception {
if(Math.abs(q-0)>PRECISION){
this.a1=a1;
this.q=q;
}else
throw new Exception("公比不能为0");
}
public GeometricSquence(double am, int m, double an, int n) throws Exception {
if(m==n)
throw new Exception("两项应为不同项");
else{
q=Math.pow(an/am, 1/(n-m));
if(Math.abs(q-0)>PRECISION){
a1=an*Math.pow(q, 1-n);
} else
throw new Exception("公比不能为0");
}
}
@Override
public double getSum(int n) {
if(q-1>PRECISION)
return a1*(1-Math.pow(q, n))/(1-q);
else
return a1*n;
}
@Override
public double getAn(int n) {
return a1*Math.pow(q, n-1);
}
}
斐波拉契数列:
package sequence;
public class FibonacciSequence extends Sequence {
// 第一项
private double a1;
// 第二项
private double a2;
public FibonacciSequence(double a1, double a2) {
this.a1=a1;
this.a2=a2;
}
public double getAn(int n) {
switch(n){
case 1:return a1;
case 2:return a2;
default:return getAn(n-1)+getAn(n-2);
}
}
public double getSum(int n) {
if(n==1)
return a1;
else
return getSum(n-1)+getAn(n);
}
}
平方根估算数列:
package sequence;
public class SqrtSequence extends Sequence {
private double radicand=0.0;//被开方数
public SqrtSequence(double radicand) {
this.radicand=radicand;
}
@Override
public double getAn(int n) {
double precision=1.0;
for(int i=0;i<n;i++)
precision/=10;
double root=0.0;
for(double d=1.0;d>=precision;d/=10)
for(;Math.pow(root+d, 2)<=radicand;root+=d);
return root;
}
@Override
public double getSum(int n) {
throw new UnsupportedOperationException();
}
}