我正在尝试创建一个程序来确定数字是素数还是复数。到目前为止我已经到了。你能给我任何想法,以便它能运作吗?但是,所有素数都是因为复合物的值都是r> 0且r == 0,它们将始终被归类为素数。我该如何解决这个问题?
int main()
{
int pNumber, limit, x, r;
limit = 2;
x = 2;
cout << "Please enter any positive integer: " ;
cin >> pNumber;
if (pNumber < 0)
{
cout << "Invalid. Negative Number. " << endl;
return 0;
}
else if (pNumber == 0)
{
cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
return 0;
}
else if (pNumber == 1)
{
cout << "Valid. However, one is neither prime nor composite" << endl;
return 0;
}
else
{
while (limit < pNumber)
{
r = pNumber % x;
x++;
limit++;
if (r > 0)
cout << "Your number is prime" << endl;
else
{
cout << "Your number is composite" << endl;
return 0;
}
}
}
return 0;
}
答案 0 :(得分:3)
结帐http://en.wikipedia.org/wiki/Prime_number和http://en.wikipedia.org/wiki/Primality_test
最简单的素性测试如下 如下:给定输入数n, 检查是否有任何整数m从2到 n - 1除以n。如果n可被整除 任何m然后n是复合的,否则 它是素数。
答案 1 :(得分:1)
#include <iostream>
#include <math.h>
// Checks primality of a given integer
bool IsPrime(int n)
{
if (n == 2) return true;
bool result = true;
int i = 2;
double sq = ceil(sqrt(double(n)));
for (; i <= sq; ++i)
{
if (n % i == 0)
result = false;
}
return result;
}
int main()
{
std::cout << "NUMBER" << "\t" << "PRIME" << std::endl;
for (unsigned int i = 2; i <= 20; ++i)
std::cout << i << "\t" << (IsPrime(i)?"YES":"NO") << std::endl;
std::cin.get();
return 0;
}
答案 2 :(得分:1)
bool check_prime(unsigned val) {
if (val == 2)
return true;
// otherwise, if it's even, it's not prime.
if ((val & 1) == 0)
return false;
// it's not even -- only check for odd divisors.
for (int i=3; i*i<=val; i+=2)
if (val % i == 0)
return false;
return true;
}
答案 3 :(得分:1)
尊重你的代码你没有检查我是否输入2将会发生什么, 如果它是素数,你也没有返回任何东西....这就是为什么它总是返回素数,尽管数字是复合的。 这是下面的代码=&gt;
#include<iostream>
using namespace std;
int main(){
int pNumber, limit, x, r;
limit = 2;
x = 2;
cout << "Please enter any positive integer: " ;
cin >> pNumber;
if (pNumber < 0){
cout << "Invalid. Negative Number. " << endl;
return 0;
}
else if (pNumber == 0){
cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
return 0;
}
else if (pNumber == 1){
cout << "Valid. However, one is neither prime nor composite" << endl;
return 0;
}
else if (pNumber == 2){
cout << " Your number is prime" << endl;
return 0;
}
else{
while (limit < pNumber){
r = pNumber % x;
x++;
limit++;
if (r > 0){
cout << "Your number is prime" << endl;
return 0;
}
else{
cout << "Your number is composite" << endl;
return 0;
}
}
}
return 0;
}
答案 4 :(得分:0)
首先,当你发现x
pNumber % x == 0
时,你会想要摆脱你的循环。您需要做的就是找到pNumber
大于1且小于pNumber
的一个因子来证明它不是素数 - 没有必要进一步搜索。如果你在没有找到的情况下一直到x = pNumber
,那么你知道pNumber
是素数。实际上,即使你找到pNumber
的平方根而没有找到它,它也是素数,因为如果它有一个大于那个的因子,它应该有一个小于那个因子。合理?
答案 5 :(得分:0)
我不知道你到目前为止所教的是什么,但我的离散数学老师是Miller-Rabin test的粉丝。这是一个非常准确的测试,非常容易编码,在一些基础测试中,你有Carmichael Number的可能性非常小。如果你在学习上没有那么远,我会坚持一些基本的数字划分规则。
答案 6 :(得分:0)
最简单的方法是给定数n,如果它可以在2到sqrt(n)之间的任何数字完全可分,它是复合数,或者它的素数
答案 7 :(得分:-1)
一种方法是使用Sieving算法,例如sieve of Eratosthenes。这是一种非常快速的方法,效果非常好。
bool isPrime(int number){
if(number == 2 || number == 3 | number == 5 || number == 7) return true;
return ((number % 2) && (number % 3) && (number % 5) && (number % 7));
}
答案 8 :(得分:-2)
您好我已经完成了这个,也没有使用math.h头文件....已经使用了turboc编译器。 以下程序检查数字是素数还是复数。
#include<iostream.h>
#include<conio.h>
class prime
{
int a;
public:
void check();
};
void prime::check()
{
cout<<"Insert a number";
cin>>a;
int count=0;
for(int i=a;i>=1;i--)
{
if(a%i==0)
{
count++;
}
}
if(count==1)
{
cout<<"\nOne is neither prime nor composite";
}
if(count>2)
{
cout<<"\nThe number is composite " ;
}
if(count==2)
{
cout<<"\nThe numner is prime";
}
}
void main()
{
clrscr();
prime k;
k.check();
getch();
}