2017-07-16 8 views
3

我是一个刚刚进入循环的Java初学者。我试图写一个程序读入一个目标,并找到第一个n,例如1 + 1/2 + 1/3 + ... + 1/n>目标。该问题提供了一个代码,初始化n和总和缺失以及缺少while和它的语句的条件。如何在Java中达到指定目标时停止对谐波序列进行求和?

我能够找出如何制作谐波系列循环,但我不确定如何设置n以在超过目标时停止循环。我们还没有在类中学过数组..

import java.util.Scanner; 

/** 
This program computes how many steps the sum 1 + 1/2 + 1/3 + ... 
needs to exceed a given target. 
*/ 
public class ReciprocalSum 
{ 
    public static void main(String[] args) 
    { 

     double sum = 0; 
     int n = ???? ; 

     Scanner in = new Scanner(System.in); 
     System.out.print("Target: "); 
     double target = in.nextDouble(); 
     int i = 0; 

//Notes 
     // 1 + 1/2 + 1/3 + 1/4 + ..... 1/n 
     //Make a loop that repeats itself starting with n = 1 --> 1/1 + 1/2 + 1/3 + 1/4 + 1/n 

     // 1.0/n + (1.0/ n - 1) + (1.0/n-2) +.... if n =4 --> 1/4 + 1/3 + 1/2 + 1/1 as long as n >0 


     while (n > 0) 
     { 
      sum += 1.0/n ; 
      n--; 
     } 

     System.out.println("n: " + n); 
     System.out.println("sum: " + sum); 
    } 
} 
+0

答案就在问题:*开头n = 1 *不确定你的循环在每次迭代中递减n而不是增加它。 –

+0

谢谢你的提示,我想我开始的方向是错的...... – Vickie

回答

2

n应该在循环中增加(并且因此应在0开始),当你到达目标的循环将被退出:

int n = 0; 

... 

while (sum <= target) 
{ 
    n++; 
    sum += 1.0/n; 
} 
+0

这段代码对我来说绝对有意义,但由于某种原因,它对我产生了错误的总和。例如:目标:1.5 n:3 总和:1.5当总和应该是 总和:1.8333333333333333。 – Vickie

+0

@Vickie在这种情况下,将条件改为'sum <= target' – Eran

+0

这使n关闭1.我试图在循环外面添加一个额外的行,说sum + = 1.0/n;这对于上面的例子有效,但是对于其他例子,导致n和sum被减1。所以我很迷茫...... – Vickie

2

由于Java具有8+ lambdas,并且您可以生成范围1n并执行您的计算,并在一步得到的总和。基本上,你可以做

Scanner in = new Scanner(System.in); 
System.out.print("Target: "); 
double target = in.nextDouble(), sum = 1.0; 
int n = 1; 
while (sum < target) { 
    sum = IntStream.range(1, n).mapToDouble(i -> 1.0/i).sum(); 
    n++; 
} 
System.out.printf("n=%d, sum=%.2f%n", n, sum); 
1

可以实现,以这种方式通过计算系列sum直至其总和大于目标值更大:

double sum = 0; 
int n = 1; 
Scanner in = new Scanner(System.in); 
System.out.print("Target: "); 
double target = in.nextDouble(); 
while(sum <= target){ 
     sum = sum + 1.0/n; 
     n = n + 1; 
} 
System.out.println(sum); 
+0

此代码导致总和为+ 1/n。我发现问题在于当sum = target时循环退出,但我不确定如何修复它。 – Vickie

+0

你可以通过这种方式改变while循环的条件为'sum <= target' 即使'target = sum'在某些情况下它也能正常工作 – Oghli