首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于"C“中的Prime Generation -我的代码有什么问题?

关于"C“中的Prime Generation -我的代码有什么问题?
EN

Stack Overflow用户
提问于 2011-01-07 06:27:27
回答 6查看 266关注 0票数 0

我是一名非正规的三年级CS学生,我刚刚意识到我必须开始编程。

我以较低的分数通过了我的编程课程,所以我在编程和编程方面没有很好的背景。

我正在试着写一段代码,它能在给定的上下界之间生成质数。不太了解C语言,强迫我写一段粗略的代码,然后再去解决它。我可以很容易地为目标函数设置逻辑,但我可能通过几种不同的方法创建了一个错误的算法。

在这里我分享我的最后一段代码,我打算计算当一个数字给余数为零时,它应该是self和1,所以count==2;我的实现和我的解决方案生成风格有什么问题?我希望你能让我熟悉编程世界,我找不到足够的动力和勇气去深入编程。

H是包含İ的

代码语言:javascript
复制
int primegen(int down,int up)
{   
    int divisor,candidate,count=0,k;

    for(candidate=down;candidate<=up;candidate++)
    {
        for(divisor=1;divisor<=candidate;divisor++)
        {
            k=(candidate%divisor);
        }
        if (k==0) count++;
        if(count==2)
        {
            printf("%d\n", candidate);
            count=0;
        }
        else
        {
            continue;
        }
    }
}

int main()
{
    primegen(3,15);
    return 0;
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-07 10:02:09

代码语言:javascript
复制
#include <stdio.h>
#include <math.h>

int primegen(unsigned int down,unsigned int up)
{   
int *ar;
int divisor,candidate,count=0,k;

for(candidate=up;candidate>=down;candidate--)
    {   count=0; 
        for(divisor=2;divisor<candidate;divisor++)
            {if (((candidate%divisor)==0)) count++; }
            if(count==0) {printf("%d\n",candidate); count=0;}

    }
}
int main()
{
primegen(3,15);
return 0;
}

最后,我纠正了我的解决方案。主要问题是在第二个for循环之前,我没有将count赋值为零。我更改了候选的顺序(从大到小),并更正了一些语法错误。

感谢所有人的帮助和回答。:)我很高兴这样做了,这样我就可以通过其他算法和问题。

票数 1
EN

Stack Overflow用户

发布于 2011-01-07 06:36:11

您在candidate%divisor测试中包含了1和candidate,这两个值都将始终返回0,因此您测试的每个数字都将显示为质数。

而不是这样:

代码语言:javascript
复制
for(divisor=1;divisor<=candidate;divisor++)

执行以下操作:

代码语言:javascript
复制
for(divisor=2;divisor<candidate;divisor++)

更新

您的代码中有太多的错误无法列出,但不管怎样,这里有几个错误:

当您检查candidate%divisork始终为candidate%candidate或0<代码>H113时,您将在for循环

  • 之外检查for循环的结果。您只检查一次k,在除数循环

  • 之后,不要在循环结束时检查D17,这是默认情况下发生的

看,这里有一些伪代码,用于最简单的实现。试着找出你的代码偏离这一点的地方:

代码语言:javascript
复制
for candidate = down to up
  // assume the candidate is primt
  prime = true

  // check all divisors from 2 to the candidate - 1, inclusive
  for divisor = 2 to candidate - 1
    if candidate % divisor == 0
      // divisor is a factor of candidate
      // candidate isn't prime, so we can stop checking
      prime = false
      break
    end if
  next divisor

  // if prime is still true, we successfully tested every number from 2..candidate
  // and found no factors
  if prime
    print "candidate {candidate} is prime!"
  end if
next candidate
票数 3
EN

Stack Overflow用户

发布于 2011-01-07 06:44:58

  • 在你的内部循环中,你计算所有因子的candidate%divisor,但只有在循环结束后,你才会检查count是否应该递增。因此,对于检查的最后一个除数,您只能为每个候选对象递增一次。
  • 也不会为外部循环中的每个候选对象重置count。因此,您可以对所有候选人的找到的因子一起计数,同时对每个候选人单独计数。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4620642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档