亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++兩種素?cái)?shù)判定方法

 更新時(shí)間:2022年08月09日 09:50:36   作者:小嗷犬  
這篇文章主要介紹了C++如何判斷一個(gè)數(shù)是不是素?cái)?shù),提供了兩種方法具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.什么是素?cái)?shù)

素?cái)?shù)又稱質(zhì)數(shù)。一個(gè)大于1的自然數(shù),除了1和它自身外,不能被其他自然數(shù)整除的數(shù)叫做素?cái)?shù);否則稱為合數(shù)(規(guī)定1既不是素?cái)?shù)也不是合數(shù))。

在許多的程序設(shè)計(jì)題目中,都會(huì)涉及到素?cái)?shù)的判斷,那我們該如何有效判斷素?cái)?shù)呢?

2.素?cái)?shù)的兩種判斷方法

(1)暴力法

從 2 到 √n

根據(jù)素?cái)?shù)的定義,我們可以使用逐個(gè)試除的方式來判斷素?cái)?shù),如果能為要判斷的數(shù)找到一個(gè)除了1和自身以外的因數(shù),那么它就是合數(shù);反之,就是素?cái)?shù)。

而這樣的因數(shù)的范圍必然在 2 ~ √n之間,所以我們便可以得到以下代碼。

int isPrime(int n)
{
	if(n <= 1)
	{
		return 0;
	}
	for (int i = 2; i * i <= n; i++)
	{
		if (n % i == 0)
		{
			return 0;
		}
	}
	return 1;
}

該函數(shù)就可以判斷輸入的數(shù)是否為素?cái)?shù)。

這個(gè)范圍還可以更進(jìn)一步地縮小。

6n-1與6n+1

數(shù)學(xué)上有一個(gè)定理,除了2和3外,只有形如6n-1和6n+1的自然數(shù)可能是素?cái)?shù),這里的n是大于等于1的整數(shù)。

如何理解這個(gè)定理呢?

所有自然數(shù)都可以寫成6n,6n+1,6n+2,6n+3,6n+4,6n+5這6種。 那么我們就可以得到下表。

自然數(shù)是否可能是素?cái)?shù)
6n不可能,為2的倍數(shù)
6n+1可能
6n+2不可能,為2的倍數(shù)
6n+3不可能,為3的倍數(shù)
6n+4不可能,為2的倍數(shù)
6n+5可能

其中6n+5可以寫作6n-1,所以除了2和3的素?cái)?shù)必然形如6n-1或6n+1。

于是我們可以寫出如下代碼。

int isPrime(int n)
{
	if(n <= 1) return 0;
	else if(n == 2 || n == 3) return 1;
	else if(n % 6 != 1 && n % 6 != 5) return 0;
	for (int i = 5; i * i <= n; i++)
	{
		if (n % i == 0)
		{
			return 0;
		}
	}
	return 1;
}

優(yōu)化后的算法具有更高的效率。

(2)篩法

暴力算法雖然可以判斷某個(gè)數(shù)是否為素?cái)?shù),但是當(dāng)它面對(duì)大量需要判斷的數(shù)據(jù)時(shí),它的效率會(huì)顯得十分低下,我們也有更好地方法來求一定范圍里的素?cái)?shù),它就是我們的篩法。

篩法,顧名思義,就是將合數(shù)從數(shù)據(jù)中篩除,剩下的自然就都是素?cái)?shù)了。

篩法也分為兩種,讓我們來逐一介紹。

埃氏篩

埃拉托斯特尼 篩法,簡稱 埃氏篩,是一種由希臘數(shù)學(xué)家埃拉托斯特尼所提出的一種簡單檢定素?cái)?shù)的算法。

要得到自然數(shù)n以內(nèi)的全部素?cái)?shù),必須把不大于根號(hào)n的所有素?cái)?shù)的倍數(shù)剔除,剩下的就是素?cái)?shù)。

下面的程序就是通過埃氏篩判斷 0 ~ MAXSIZE-1是否為素?cái)?shù)。

#define MAXSIZE 10000
int isPrime[MAXSIZE] = { 0 };
void sieveOfEratosthenes()
{
	for (int i = 2; i < MAXSIZE; i++)
	{
		isPrime[i] = 1;
	}
	for (int i = 2; i * i < MAXSIZE; i++)
	{
		if (isPrime[i])
		{
			for (int j = i * 2; j < MAXSIZE; j += i)
			{
				isPrime[j] = 0;
			}
		}
	}
}

埃氏篩的時(shí)間復(fù)雜度是O(n*loglogn),效率相較于原來的暴力算法已經(jīng)有了很大的提高,但它仍然有具有一定的不足。

對(duì)于多個(gè)素?cái)?shù)的公倍數(shù),可能會(huì)被多次篩去。

為了解決這個(gè)問題,數(shù)學(xué)家歐拉優(yōu)化了算法,于是就有了新的篩法。

歐拉篩

歐拉篩法,簡稱歐拉篩或是歐式篩,又因?yàn)槠銸(n)的時(shí)間復(fù)雜度而被稱為線性篩。

歐拉篩將合數(shù)分解為(最小質(zhì)因數(shù) * 一個(gè)合數(shù))的形式,通過最小質(zhì)因數(shù)來判斷當(dāng)前合數(shù)是否已經(jīng)被標(biāo)記過,與埃氏篩相比,不會(huì)對(duì)已經(jīng)被標(biāo)記過的合數(shù)再進(jìn)行重復(fù)標(biāo)記,故效率更高。

下面的程序就是通過歐拉篩判斷 0 ~ MAXSIZE-1是否為素?cái)?shù)。

#define MAXSIZE 10000
int isPrime[MAXSIZE] = { 0 };
int prime[MAXSIZE];
int cnt = 0;
void sieveOfEuler()
{
	for (int i = 2; i < MAXSIZE; i++)
	{
		prime[i] = 1;
	}
	for (int i = 2; i * i < MAXSIZE; i++)
	{
		if (isPrime[i])
		{
			prime[++cnt] = i;
		}
		for (int j = 1; i * prime[j] < MAXSIZE; j++)
		{
			isPrime[i * prime[j]] = 0;
			//若i為prime[j]的倍數(shù),終止循環(huán),避免重復(fù)篩除
			if (i % prime[j] == 0)
                break;
		}
	}
}

在求一定范圍中的所有素?cái)?shù)時(shí),歐拉篩具有無可比擬的優(yōu)勢,在程序設(shè)計(jì)中也經(jīng)常被采用。

到此這篇關(guān)于C++兩種素?cái)?shù)判定方法的文章就介紹到這了,更多相關(guān)C++素?cái)?shù)判定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)

    這篇文章主要介紹了使用C語言實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++文件的操作及小實(shí)驗(yàn)示例代碼詳解

    C++文件的操作及小實(shí)驗(yàn)示例代碼詳解

    這篇文章主要介紹了C++文件的操作及小實(shí)驗(yàn),對(duì)于文件,它是一個(gè)流對(duì)象,對(duì)文件的操作無非是讀和寫,通過本文的學(xué)習(xí)大家將會(huì)理解文件的具體操作
    2022-05-05
  • C語言之qsort函數(shù)詳解

    C語言之qsort函數(shù)詳解

    這篇文章主要介紹了C語言中qsort函數(shù)的用法實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C?語言注釋和變量使用基礎(chǔ)詳解

    C?語言注釋和變量使用基礎(chǔ)詳解

    這篇文章主要為大家介紹了C語言注釋和變量使用示例基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C++11中移動(dòng)構(gòu)造函數(shù)案例代碼

    C++11中移動(dòng)構(gòu)造函數(shù)案例代碼

    C++11 標(biāo)準(zhǔn)中為了滿足用戶使用左值初始化同類對(duì)象時(shí)也通過移動(dòng)構(gòu)造函數(shù)完成的需求,新引入了 std::move() 函數(shù),它可以將左值強(qiáng)制轉(zhuǎn)換成對(duì)應(yīng)的右值,由此便可以使用移動(dòng)構(gòu)造函數(shù),對(duì)C++11移動(dòng)構(gòu)造函數(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2023-01-01
  • C和C++混合編程問題

    C和C++混合編程問題

    這篇文章主要介紹了C和C++混合編程問題,需要的朋友可以參考下
    2015-10-10
  • vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    本文主要介紹了如何使用visual studi2019配置qt5開發(fā)環(huán)境,以及創(chuàng)建qt項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 詳解QT使用http通信的同步和異步

    詳解QT使用http通信的同步和異步

    在Qt與Http通信的時(shí)候,會(huì)根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請(qǐng)求,下面我們就來深入了解一下http通信的同步和異步的相關(guān)知識(shí),感興趣的小伙伴可以了解下
    2023-12-12
  • 詳解C語言編程中預(yù)處理器的用法

    詳解C語言編程中預(yù)處理器的用法

    這篇文章主要介紹了C語言編程中預(yù)處理器的用法,包括介紹了C和C++混合編程的情況,需要的朋友可以參考下
    2016-02-02
  • C++中的ilst使用以及模擬實(shí)現(xiàn)

    C++中的ilst使用以及模擬實(shí)現(xiàn)

    list是一個(gè)類模板,加<類型>實(shí)例化才是具體的類,可以在任意位置進(jìn)行插入和刪除的序列式容器,本文將通過代碼示例給大家介紹一下C++中的ilst使用以及模擬實(shí)現(xiàn),需要的朋友可以參考下
    2023-08-08

最新評(píng)論