有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

循环如何在谐波序列达到Java中的指定目标时停止求和?

我是一个Java的完全初学者,最近刚刚开始学习循环。我正试图编写一个程序,读入一个目标并找到第一个n,这样1+1/2+1/3+…+1/n>;目标该问题提供了一个代码,其中包含初始化为n和sum missing以及while的条件及其语句missing

我能够计算出如何使谐波串联循环,但我不确定在超过目标时用什么设置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);
    }
}

共 (3) 个答案

  1. # 1 楼答案

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

    int n = 0;
    
    ...
    
    while (sum <= target) 
    {  
        n++;
        sum += 1.0/n;
    }
    
  2. # 2 楼答案

    因为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);
    
  3. # 3 楼答案

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