【问题标题】:Find largest prime number below input value查找低于输入值的最大素数
【发布时间】:2019-10-24 01:35:43
【问题描述】:

首先让我说我是初学者。我正在尝试定义一个函数来计算/识别输入值以下的最大素数。但是,我目前的方法是有缺陷的。

我尝试过实现嵌套的 for 循环。从输入下面的一个到 1 生成数字,随后通过第二个循环运行每个数字,以识别它是否是素数。如果它是素数(如果 count == 2),该函数应该返回第一个循环 (n) 生成的数字

我被允许假设输入将是一个大于 2 的正整数。

int prime(int maximum)
{
int i, j, count = 0, n;

for (i = 1; i < maximum; i++) {
        n = maximum - i; /* generating number below input value*/ 
        for (j = 1; j <= maximum; j++) {
            if (n % j == 0) { /* testing whether or not it is prime */
                count++;
            } 
        } if(count == 2) {
                break;
            } 
    } 
    return n;
}

我希望输入 10 会产生 7 的输出,输入 30 会产生 29 的输出,输入 100 会产生 97 的输出。

但是,该函数当前始终生成 1 的输出。

代码没有产生任何错误信息

注意:这是我第一次使用这个平台,如果我的问题格式不正确,我最诚挚的歉意

【问题讨论】:

  • 暂时忘记您使用的计算机语言。你对你的算法/方法有信心吗?您需要先确保它是合乎逻辑的,然后再实现 C。
  • 拿一个调试器或纸笔,一步一步地用一些固定的输入来完成你的函数,写下或观察每一步中所有变量的值。看count特别近。那么你应该意识到你的逻辑错误。
  • 你应该知道n % 1 == 0 for ALL n &gt; 0 - 你可能*不想开始j循环。
  • 新话“负责定义”。古语“我的作业是”。
  • 检查count 的值。它不会做你认为它做的事情。

标签: c loops


【解决方案1】:

问题是你在外循环中是not resetting the count to 0
这将解决问题。

进一步添加, 还有一些其他的优化可以在代码中完成。

你不需要运行内部循环maximum 次,only n times 就足够了,因为你正在检查whether n is prime or not.

您可以将break condition inside the inner for loop 用于计数超过 2 的人,以避免进一步的迭代。

int prime(int maximum)
{
int i, j, count = 0, n;

for (i = 1; i < maximum; i++) {
        count = 0;  # <-----  Reset it to 0.
        n = maximum - i; /* generating number below input value*/ 
        for (j = 1; j <= n; j++) {
            if (n % j == 0) { /* testing whether or not it is prime */
                count++;
                if(count > 2) # to avoid further iterations as we know, this number is not prime.
                   break;
            } 
        } if(count == 2) {
                break;
            } 
    } 
    return n;
} 

【讨论】:

  • 您还需要修复j 范围。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
相关资源
最近更新 更多