【问题标题】:What is wrong with my one line prime function in java?我在 java 中的单行素数函数有什么问题?
【发布时间】:2019-10-03 18:16:37
【问题描述】:

编辑

我想创建一个 java 程序,输出小于给定数字n 的所有素数,提示用户输入。挑战在于编写一个在一行中完成此操作的函数。它并没有使它成为更好的代码,但仍然是一个有趣的挑战。

我从我的main 方法开始,我要求用户输入并将其作为我的Primes(int number, int divisor) 方法的参数传递。这个方法有两个参数,numberdivisor。该方法检查number 是否可以被divisor 整除。如果后者不划分前者,则该方法再次使用divisor = divisor - 1 调用自身,直到the divisor = 1。万岁,我们找到了一个质数。因此,我必须打印它并且必须再次使用number = number - 1divisor = number - 2 调用我的方法。我必须这样做,因为我必须检查每个小于 number 的素数。

Primes(number-1, number-2).

一个方法可以返回一个值AND来同时调用另一个方法吗?我需要这样的东西:

    ...condition ? do smth : return n && Primes(smth)...

如果我不够清楚,请告诉我。 提前致谢,

这是我的代码。它看起来很奇怪,但如果你花时间看它真的很简单:

 import java.*;
 import java.util.Scanner;

public class Main {

    public static int Primes(int n, int k) {
        return ((k == 0) ? n : (k == 1 && n == 1) 
                         ? n : (k == 1 && n > 1) 
                         ? Primes(n-1, n-2) : (n % k) != 0 
                         ? Primes(n, k-1) : Primes(n-1, n-2));
    }
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        Scanner s = new Scanner(System.in);
        int num = s.nextInt();
        System.out.println("The primes are: " + Primes(num, (num-1)));
    }

}

【问题讨论】:

  • 你觉得写成一行有什么好处?
  • 代码不会因为写在一行就更好,而是写可读的代码,这样你就可以阅读和理解它。
  • 天哪,条件是......其他东西......也许可以用一些普通的 ol if/else 块
  • k == 0 -> n*893953 不是素数(除非计算溢出); k == 1 && n == 1 -> n,即1,也不是素数;否则递归调用(以前两个值之一结束,而不是素数)另一个问题Primes 是返回一个值。
  • @Kirby:让你大吃一惊,不是吗? :)

标签: java primes conditional-operator


【解决方案1】:

我找到了应对挑战的方法。看看你是否感兴趣,虽然我知道这不是最佳选择。由于我找不到return n && Primes(smth) 的方法,我创建了一个新方法PrintPrimes(int n),它将打印n 并调用Primes(n-2, n-3)。这里是:

import java.*;
import java.util.Scanner;
    
public class Main {
    
  public static int Primes(int n, int k) {
    // Check if k and n are lower than 2 we're done because we've checked every number from n all the way down to 1
    // If k is 1 and n is greater than 1 we've found a prime and have to print it
    // If n modulo k yields 0 then n is not prime. We call the method again with n = n - 1
    // If n mod k is different than 0, we call the method again with k = k - 1
    
    return ((k < 2 && n < 2) ? PrintPrimes(n) : (k == 1 && n > 1) 
                             ? PrintPrimes(n) : (n % k) != 0 
                             ? Primes(n, k-1) : Primes(n-1, n-2));
    }
        
    public static int PrintPrimes(int n) {
            System.out.println(n);
            return ((n == 1) ? n : Primes(n-2, n-3));
    }
        
    public static void main(String[] args) {
    // TODO Auto-generated method stub
            
     Scanner s = new Scanner(System.in);
     int num = s.nextInt();
     Primes(num, (num-1));
    }
    
}

这很好用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2015-09-30
    • 2017-10-07
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多