【发布时间】:2020-09-06 17:41:28
【问题描述】:
我们有一个与 Prime 相关的编码作业,我的朋友编写了这段代码。它很长,我不太了解它,并且有goto,我认为这是不受欢迎的,所以我不知道。可以帮助决定我们是否应该保留它?
int getNth (int nth){
vector<int> prime;
int sievelmt = nth*10;
int i,j;
func:
vector<int> sieve(sievelmt, -1);
prime.push_back(2); if (nth == 1) return 2;
prime.push_back(3); if (nth == 2) return 3;
prime.push_back(5); if (nth == 3) return 5;
for (i = 2; i <= sievelmt; i++)
{
if (i%2==0||i%3==0||i%5==0) continue;
if (sieve[i] == -1)
{
prime.push_back(i); if (prime.size()==nth) return prime[prime.size()-1];
for ( j = 1; i*j <= sievelmt; j++) sieve[i*j]=j;
}
else continue;
}
sievelmt *= 10;
sieve.clear(); prime.clear();
goto func;
return -1;
}
【问题讨论】:
-
那么标签和
goto可以很容易地被无限循环替换。永远不要使用标签和goto作为循环。 -
对于这段代码我该怎么做?
-
代码不清楚的时候第一个问的是作者。你问你朋友了吗?
-
他说找到第 n 个素数。我们不确定这段代码是否正确。
-
嗯,这是主观的,但我个人觉得他扔掉所有之前的中间结果并在发现他的向量太小时重新开始有点蹩脚。