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