Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于“中的黄金一代”;C";-我的代码有什么问题-_C_Math_Computer Science - Fatal编程技术网

关于“中的黄金一代”;C";-我的代码有什么问题-

关于“中的黄金一代”;C";-我的代码有什么问题-,c,math,computer-science,C,Math,Computer Science,我是一名三年级的非正规CS学生,我刚刚意识到我必须开始编码 我以较低的分数通过了编码课程,因此我在编码和编程方面没有很好的背景 我正试图编写一个代码,在给定的上界和下界之间生成素数。由于对C不太了解,请强制我编写一个粗略的代码,然后再检查它以解决问题。我可以很容易地为预期的功能设置逻辑,但我可能通过几种不同的方式创建了错误的算法 在这里我分享我的最后一段代码,我打算计算当一个数字给余数零时,它应该是self和1,所以count==2;我的实现和解决方案生成风格有什么问题?我希望你们能让我对编程世

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

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

我正试图编写一个代码,在给定的上界和下界之间生成素数。由于对C不太了解,请强制我编写一个粗略的代码,然后再检查它以解决问题。我可以很容易地为预期的功能设置逻辑,但我可能通过几种不同的方式创建了错误的算法


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

包括标准和数学

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;
}
int-primegen(int-down,int-up)
{   
整数除数,候选,计数=0,k;

对于(candidate=down;candidate您在
candidate%除数
测试中包含了1和
candidate
,这两者都将始终返回0,因此您测试的每个数字都将显示为素数

与此相反:

for(divisor=1;divisor<=candidate;divisor++)

candidate%除数
测试中包含1和
candidate
,两者都将始终返回0,因此测试的每个数字都将显示为素数

与此相反:

for(divisor=1;divisor<=candidate;divisor++)

需要记住的一些提示

if(!(candidate & 0x01))
    // We know its even so we can stop

if(candidate == potential_factor)
    // We can stop

if(candidate % potential_factor == 0)
    // The potential factor IS a factor and we can stop

需要记住的一些提示

if(!(candidate & 0x01))
    // We know its even so we can stop

if(candidate == potential_factor)
    // We can stop

if(candidate % potential_factor == 0)
    // The potential factor IS a factor and we can stop
  • 在内部循环中,您为所有除数计算
    candidate%除数
    ,但只有在循环完成后,您才检查
    count
    是否应递增。因此,对于最后一个检查的除数,您仅为每个候选数递增一次
  • 此外,您不需要为外部循环中的每个候选项重置
    count
      • 在内部循环中,您为所有除数计算
        candidate%除数
        ,但只有在循环完成后,您才检查
        count
        是否应递增。因此,对于最后一个检查的除数,您仅为每个候选数递增一次
      • 此外,您不需要为外部循环中的每个候选项重置
        count

      有人为了清晰起见,从最初提交的表单中重新格式化了代码。在这样做的过程中,他们修改了代码中的三个错误之一

      第一个错误是,第二个for语句后面没有括号。因此,循环体仅由第二个for语句后面的语句组成。从阅读代码中可以清楚地看出,提问者有意重复执行第二个for语句后面的所有语句。这不是发生的事宁

      基本上,这个想法是:对于范围内的每个数字,尝试1和候选数字之间的所有数字。数一数除以它的数字。看看是否正好有2个。这是一个正确的算法,说不除以2的答案是错误的

      然而,实现是这样做的:对于范围内的每个数字,将候选者除以1和候选者之间的每个数字。然后,完成所有除法后,检查最后一个数字是否为偶数,如果为偶数,则将1添加到计数中。因此,实际情况是,您只检查
      候选者%candi日期==0
      它总是这样做

      第二个错误是,计数只有在达到2时才会重置。因此,发生的情况是,对于任何输入,代码都会每隔一个数字返回一次。对于每个候选项,
      count++
      只发生一次。因此,它达到2后每隔一次重置一次


      第三个错误是,一旦最里面的循环被修复,那么continue将做错误的事情,因为它只继续最里面的循环。

      有人为了清晰起见从原始提交的表单重新格式化了代码。在这样做的过程中,他们修改了代码中的三个错误之一

      第一个错误是,第二个for语句后面没有括号。因此,循环体仅由第二个for语句后面的语句组成。从阅读代码中可以清楚地看出,提问者有意重复执行第二个for语句后面的所有语句。这不是发生的事宁

      基本上,这个想法是:对于范围内的每个数字,尝试1和候选数字之间的所有数字。数一数除以它的数字。看看是否正好有2个。这是一个正确的算法,说不除以2的答案是错误的

      然而,实现是这样做的:对于范围内的每个数字,将候选者除以1和候选者之间的每个数字。然后,完成所有除法后,检查最后一个数字是否为偶数,如果为偶数,则将1添加到计数中。因此,实际情况是,您只检查
      候选者%candi日期==0
      它总是这样做

      第二个错误是,计数只有在达到2时才会重置。因此,发生的情况是,对于任何输入,代码都会每隔一个数字返回一次。对于每个候选项,
      count++
      只发生一次。因此,它达到2后每隔一次重置一次


      第三个错误是,一旦最里面的循环是固定的,那么继续将做错误的事情,因为它只延续最里面的循环。

      < P>我知道你的代码只用于教育目的,但是你应该考虑ErasoStes筛子,因为它可能是你的问题的最快算法。它主要做的是:

      首先考虑所有数的素数,
    • 出发
      #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;
      }