[英]C++ question on prime numbers
我正在嘗試制作一個確定數字是素數還是復合數的程序。 我到目前為止。 您能給我些什么想法,以使其起作用嗎? 但是,所有素數都將是因為復合材料的值都為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;
}
查看http://en.wikipedia.org/wiki/Prime_number和http://en.wikipedia.org/wiki/Primality_test
最簡單的素數測試如下:給定輸入數n,檢查從2到n − 1的整數m是否除以n。 如果n可被任何m整除,則n為合成數,否則為質數。
#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;
}
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;
}
關於您的代碼,您沒有檢查我是否輸入2將會發生什么,並且如果它是質數,您也沒有返回任何東西。 這是下面的代碼=>
#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;
}
一方面,當您找到一些x
,其中pNumber % x == 0
時,您會希望跳出循環。 您需要做的就是找到pNumber
大於1且小於pNumber
一個因子以證明它不是素數-進一步搜索毫無意義。 如果一路找到x = pNumber
卻沒有找到一個,則說明pNumber
是質數。 實際上,即使您未找到pNumber
平方根,它也是質數,因為如果pNumber
的因數大於該因數,則它的因數應小於該因數。 說得通?
我目前為止還不知道您所教的是什么,但是我的離散數學老師是Miller-Rabin考試的粉絲。 這是一個非常准確的測試,非常容易編寫代碼,在一些基本測試中,您擁有Carmichael Number的機會非常小。 如果您的學習還沒到那兒,我會堅持一些基本的數字除法規則。
最簡單的方法是對於給定的數n,如果它可以被2到sqrt(n)之間的任何數完全可整除,則它可以是復合數,也可以是素數
嗨,我做到了這一點,也沒有使用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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.