此问题已回答 所以基本上,我只是写下了代码以显示所有低于100的素数。这是代码:
#include <iostream>
using namespace std;
int main()
{
int n=2,i;
cout<<"All Prime numbers below 100 are : \n";
while(n<=100)
{
for(i=2; i<n/2; i++)
{
if (n%i==0)
{
goto restart;
}
else
{
cout<<n<<"\t";
}
}
restart:
n++;
}
return 0;
}
但是输出不是2 3 5 7 11 .....而是:
All prime numbers below 100 are:
7 9 11 11 11 13 13 13 13 15 15 and so on ...
我只希望输出显示从2到97的所有素数而不重复。谢谢。
/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-
我稍加修改就摆脱了问题。
#include<iostream>
using namespace std;
int main()
{
int n=2, i;
while(n<=100)
{
for(i=2; i<=n/2; i++)
{
if(n%i==0)
{
goto label;
}
}
cout<<n<<", ";
label:
n++;
}
return 0;
}
感谢大家宝贵的时间。(而且之所以使用此类初学者类型代码,是因为我像一个星期前才刚开始使用C ++。我有很多代码(例如bool,isPrime等)进行学习。)
保持启动代码,其他编码员:D
答案 0 :(得分:3)
您的算法存在明显错误。您也许可以使用调试器找到它,但是我认为更好的方法是让您了解提取函数的方法。您想要主要功能执行的操作就是:Child
。所以你应该这样写:
check_output
为此,您当然需要定义函数subprocess.check_output(['python', 'myPythonFile.py'])
:
if n is prime: output n
还请注意,无需检查int main()
{
for (int i = 0; i < 100; ++i)
if (is_prime(i))
std::cout << i << std::endl;
}
是否可被大于其平方根的数字整除。如果在平方根前没有除数,则下一个可能的除数就是is_prime
本身。
正如其他人提到的那样,这不是解决此问题的最佳算法,但是对于较小的值,它绝对足够好。
答案 1 :(得分:2)
您的回答还可以,但是有两个严重错误。首先,为您检查的每个模输出n
。如果所有模检查均失败,则仅应输出n
。另外,您的边界条件不太正确-应该为<=
。只需最少的更改即可工作的代码为:
#include <iostream>
using namespace std;
int main()
{
int n=2,i;
cout<<"All Prime numbers below 100 are : \n";
while(n<=100)
{
for(i=2; i<=n/2; i++)
{
if (n%i==0)
{
goto restart;
}
}
cout<<n<<"\t";
restart:
n++;
}
return 0;
}
如果您想编写更简洁的代码,则不要使用goto
,请使用双for
循环和break
。另外,您对i
的边界条件应该为i*i<=n
,因为那是更严格的界限。像这样:
#include <iostream>
int main()
{
cout<<"All Prime numbers below 100 are : \n";
for(int n=2; n<100; ++n)
{
bool isPrime = true;
for(int i=2; i*i<=n; i++)
{
if (n%i==0)
{
isPrime = false;
break;
}
}
if(isPrime)
std::cout<<n<<"\t";
}
}
答案 2 :(得分:0)
您正在尝试检查每个数字是否为素数。因此,您必须检查是否可以将其除以较小的数字。
查找所有素数直至最大数的更有效方法是Erathosthenes筛子:
#include <iostream>
#include <vector>
int main() {
const unsigned int maxNum(100);
std::vector<bool> prime(maxNum, true);
for (unsigned int i(2); i*i < maxNum; ++i) {
if (!prime[i]) continue;
for (unsigned int j(2*i); j < maxNum; j += i) {
prime[j] = false;
}
}
for (unsigned int i(2); i < maxNum; ++i) {
if (prime[i]) std::cout << i << std::endl;
}
return 0;
}
将创建所有号码的列表。每个数字的每个倍数都将从此列表中删除。