用JAVA编写一个有理数求和1/1+1/2+1/3...1/n,要求其结果用最简分数表示。

用JAVA编写一个有理数求和1/1+1/2+1/3...1/n,要求其结果用最简分数表示。例如:n=3,结果1/1+1/2+1/3=5/6。最简分数本人使用欧几里得方法可以解出,但是分子的计算方法没办法求。
请教高手,只需写出分子的方法即可。
我不是要小数的结果,是要有理数的结果,就是以分数的形式。即使发散,只要不是无限,都可以求出来。那个n 是要求用户输入的。所以肯定会有结果啊~!~!

# package com.ray.demo.funny;
#
# import java.math.BigDecimal;
#
# /**
# * 计算 1/1+1/2+1/3+1/4+....+1/n=?
# * 由于我想算比较大的数,所以用BigDecimal代替int (可以看到我例子里是用n=1000)
# * 另外为了排版好看,我在前面加了一些符号
# */
# public class Main {
#
# // 求a、b最大公约数
# public static BigDecimal gcd(BigDecimal a, BigDecimal b) {
# if (a.compareTo(b) < 0) {
# BigDecimal tmp = a;
# a = b;
# b = tmp;
# }
# if (b.equals(BigDecimal.ZERO)) {
# return a;
# }
# while (b.compareTo(BigDecimal.ZERO) > 0) {
# // tmp = a % b
# BigDecimal t = a.divideToIntegralValue(b).negate();
# BigDecimal tmp = a.add(b.multiply(t));
# a = b;
# b = tmp;
# }
# return a;
# }
#
# // 求a、b最小公倍数
# public static BigDecimal lcm(BigDecimal a, BigDecimal b) {
# return a.multiply(b).divide(gcd(a, b));
# }
#
# public static void main(String[] args) {
# BigDecimal numerator = BigDecimal.ZERO; // 分子
# BigDecimal denominator = new BigDecimal(1); // 分母
# int n = 1000;
# // 计算公分母
# for (int i = 2; i <= n; i++) {
# denominator = lcm(denominator, new BigDecimal(i));
# }
# // 计算分子之和
# for (int i = 1; i <= n; i++) {
# numerator = numerator.add(denominator.divide(new BigDecimal(i)));
# }
# // 约分
# BigDecimal d = gcd(numerator, denominator);
# System.out.println("result is " + numerator.divide(d) + "/" + denominator.divide(d));
# }
#
# }
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-05
public class result
{
public String addNumbers(int n)
{
String fenziresult;
int sumFenzi=0;
int fenmu=1;
int index=0;
//求分子
for(int i=1;i<=n;i++)
{
index++;
int data=1;
for(int j=1;j<=n;j++)
{
if(index==j)
{
continue;
}
else
{
data=data*j;
}
}
sumFenzi+=data;
}
//求分母
for(int i=1;i<=n;i++)
{
fenmu=fenmu*i;
}
fenziresult=Integer.toString(sumFenzi);
return fenziresult+"/"+fenmu;//返回分数结果
}
public static void main(String[] args)
{
result r=new result();
System.out.println(r.addNumbers(3));
}
}

我写的程序,已经试过了没问题,可以求出分数结果。本回答被提问者采纳
第2个回答  2008-11-05
//计算1/1+1/2+1/3....+1/n的结果
//我用递归写的~你可以考虑用其他方法写写看
//读入有个IOException我直接抛出了,你可可以CATCH一下
import javax.swing.JOptionPane;
public class a{
public static void main(String[] args) {
a q = new a();
int n=new Integer(JOptionPane.showInputDialog(null, "输入数的个数")).intValue(); //从输入读入一个数n
int y = q.m(n),x = q.zi(1,n,n)+y;;//如果是从1/2到1/N就去掉+y
for(int i=2;i<y;i++)
if(y%i==0&&x%i==0){
x=x/i;
y=y/i;
}
System.out.println(x+"/"+y);
}
public int zi(int x,int y,int z) {//求分子
if(z!=2)
return zi((y+x*(z-1)),y*(z-1),z-1);
else return x;
}
public int m(int n) {//求分母
if (n!=1)
return n*m(n-1);
else return 1;
}
}
第3个回答  2008-11-05
...我觉得你若已经知道分母了,那就等于是做完了

你可以用循环求出这个式子的值,然后求分子就相当于知道了除数和商求被除数..除数是你的整数分母,商是刚求的那个DOUBLE型的数..分子就是这俩的乘积。

结果是DOUBLE,需要进行向上或向下取整运算,因为你的分母已经是整数了,所以必然有个取整结果是分子..另一个是误差分子...

话说楼主...能把你的欧几里得大法发给我参看参看么..我压根就没听过这方法...谢谢谢谢谢谢谢谢
第4个回答  2008-11-05
import javax.swing.JOptionPane;

public class Answer
{
public static void main(String[] args)
{
int n=new Integer(JOptionPane.showInputDialog(null, "输入数的个数")).intValue();
Fraction sum=new Fraction(0,0,1);
for(int i=1;i<=n;i++)
sum.addTo(new Fraction(0,1,i));
JOptionPane.showMessageDialog(null, "Result: "+sum);
}

static class Fraction
{
private int int_,up,down;
public Fraction(int int_,int up,int down)
{
this.int_=int_;
this.up=up;
this.down=down;
}
public Fraction addTo(Fraction ano)
{
int_+=ano.int_;
up=up*ano.down+ano.up*down;
down=ano.down*down;
toSimple();
return this;
}
public void toSimple()
{
int_+=up/down;
up%=down;
int[] r={up,down};
while(r[0]!=0)
{
int t=r[1]%r[0];
r[1]=r[0];
r[0]=t;
}
up/=r[1];
down/=r[1];
}
public String toString()
{
return int_+" + "+up+"/"+down;
}
}
}
相似回答