如何在达到 Java 中的指定目标时停止对谐波级数求和?

How to stop summing a harmonic series when it reaches a specified target in Java?

我是 Java 的初学者,最近刚接触循环。我正在尝试编写一个程序,该程序读取目标并找到第一个 n 使得 1 + 1/2 + 1/3 + ... + 1/n > 目标。该问题提供了一个代码,其中缺少 n 和 sum 的初始化以及 while 的条件及其语句。

我能够弄清楚如何制作谐波级数循环,但我不确定当它超过 target.We 时如何设置 n 来停止循环target.We我还没有了解数组class 还..

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);
    }
}

n 应该在循环中递增(因此它应该从 0 开始),当你到达目标时应该退出循环:

int n = 0;

...

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

因为 Java 8+ 有 lambda,你可以生成一个范围 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);

您可以通过计算序列的 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);