如何在达到 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,你可以生成一个范围 1
到 n
并执行你的计算并一步得到总和。基本上,你可以做到
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);
我是 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,你可以生成一个范围 1
到 n
并执行你的计算并一步得到总和。基本上,你可以做到
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);