【问题标题】:Why is the proof counter for Prime number is not working为什么素数的证明计数器不起作用
【发布时间】:2019-10-02 14:10:52
【问题描述】:

我正在尝试制作一个检测主要因素的程序。流程如下:

  1. 检测数字是否为因数
  2. 如果是因子/f,则从f-1、f-2、...开始依次划分
  3. 对于任何有余数的除法,证明计数器将递增
  4. 如果最终证明计数器 = f-2,它将通知 PRIME FACTOR

但是,当程序运行时,证明计数器部分的“for循环”将不起作用。

例如,当因子为 6 时,证明仅适用于:

  • 6 % 5
  • 6 % 4
  • 证明计数器 = 2

然后跳起来寻找另一个因素

我想知道为什么会这样?

(如果这个问题很混乱,请见谅)

int N = input.nextInt();

    for(int i =N; i>1; i--){
        if(N%i == 0){
            f = i;
            int proof = 0;

            System.out.println("factor:" + f);

            for(int j = f-1; j>=1; j--){
                if(f%j != 0){
                    proof++;
                    System.out.println("proved when j is " + j);
                }
            }
            System.out.println("no of proof"+proof);
            if(proof == f-2){
                    System.out.println(f + "is PRIME");


            }

        }
    }

【问题讨论】:

  • 如果满足条件proof == f - 2,则跳出循环。
  • @DrewReese 证明计数器出错了,所以满足条件的机会不大,哈哈
  • 最好提供一个minimal reproducible example,其中包括fproof 等的声明。此外,还请提供它不起作用的示例、您的预期以及什么你遇到了这些情况。
  • proof 的初始值是什么/在哪里?每次迭代在哪里重置?
  • @Thomas 嗨,我尝试包含输出屏幕截图

标签: java primes


【解决方案1】:

3 和 2 都除以 6,因此您的代码中不会输出任何内容。如果您想看到算法尝试这些数字,那么您还需要打印除您证明的那些尝试之外的所有尝试。

int N = input.nextInt();

for (int i = N; i > 1; i--) {
  if (N % i == 0) {
    int f = i;
    int proof = 0;

    System.out.println("factor:" + f);

    for (int j = f - 1; j >= 1; j--) {
      System.out.println("j: " + j); // <-- current value proving
      if (f % j != 0) {
        proof++;
        System.out.println("proved when j is " + j);
      }
    }
    System.out.println("no of proof" + proof);
    if (proof == f - 2) {
      System.out.println(f + "is PRIME");
    }
  }
}

这是一个正在运行的 javascript 版本的算法,它显示了持续的计算。

let N = 6;

for(let i = N; i > 1; i--) {
  console.log(`${N} % ${i}`);
  if (N % i === 0) {
    let f = i;
    let proof = 0;

    console.log("factor:", f);

    for(let j = f - 1; j >= 1; j--) {
      console.log('j', j); // show attempts here
      if (f % j !== 0) {
        proof++;
        console.log("proved when j is " + j);
      }
    }
    
    if (proof === f-2) {
      console.log(f + " is PRIME");
    }
    console.log("number of proofs: " + proof);
  }
}

【讨论】:

  • 为什么要切换语言?
  • Stackoverflow 没有适用于 Java afaik 的可执行平台,这个问题似乎与算法有关,而不是与语言有关。这就是为什么我在前面加上“这是一个 javascript 版本...”
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2020-03-28
  • 2021-08-02
相关资源
最近更新 更多