最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言素數(質數)判斷的3種方法舉例

 更新時間:2023年11月03日 11:27:57   作者:小魚小魚醬  
這篇文章主要給大家介紹了關于C語言素數(質數)判斷的3種方法,質數是只能被1或者自身整除的自然數(不包括1),稱為質數,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

摘要

本文介紹了判斷素數的3種方法,從素數的概念分析,確定找到素數的幾個必要條件,設計思路,并將代碼進行優(yōu)化。此外,還使用自定義函數的形式將同樣的思路進行實現。

方法1

素數是什么

素數,就是僅能被自身和1整除的數字。

條件分析

首先我們可以提取出判斷素數的三個基本條件:

素數是整數

素數能被自身整除

素數能被1整除

設計思路

以一道題為例——

求100到200之間的所有素數并輸出。

大體思路

  • 遍歷
    • 首先,得到100到200間的所有數字(記為a)——for循環(huán)
    • 當 A%B==0時說明A被B整除了
    • 根據兩個基本條件——a能被1整除,且a能被自身整除,所以除數(記為b)應為2到a-1間的所有數字——for循環(huán)
  • 設置判斷條件
    • 當a%b==0時a不是素數
    • 設置標記變量flag,當a%b==0時令flag=1;后續(xù)循環(huán)沒必要進行,因此設置break;結束該循環(huán)。
    • 特別注意flag何時初始化為0

具體代碼實現

#include<stdio.h>

int main()
{
	int a, b, flag;
	for (a = 100; a <= 200; a++)	//得到100到200間的所有數字
	{
		flag = 0;				 //先假設a為素數 
		for (b = 2; b < a; b++)	 //注意,不要忘了自身也能被整除!
		{
			if (a % b == 0)
			{
				flag = 1;  //若出現不能整除的情況,則令flag為1 
				break;
			}

		}						//標記變量——flag
		if (0 == flag)
			printf("%d ", a);
	}
	return 0;
}

最終結果輸出為——

101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

代碼優(yōu)化

我們先解決一個數學問題——

若a為一個整數,則顯然a=√a√a,因為√a=√a,所以若有其他數cd=a,則一定存在一個數大于√a,一個數小于√a,因此大于√a之后的數字我們不需要再進行遍歷了。
(同理,如果你不想思考這么多,寫個b<n/2也比全部遍歷好多了)

因此第二個循環(huán):

for (b = 2; b < a; b++)

我們可以優(yōu)化為——

int k;
k=(int)sqrt((double)a);	
for (b = 2; b < a; b++)

注:求平方根函數內參數要求為double類型,因此先將a強制轉換為double型,而k是整型,所以將sqrt計算返回值再進行強制轉換為int型。

或者用不那么繞的寫法——

int k;
k=(int)sqrt(1.0*a);		//1.0*a同樣將a強制轉換為double型
for (b = 2; b < a; b++)

所以優(yōu)化之后的代碼為——

#include<stdio.h>
#include<math.h>	//sqrt在math.h頭文件中

int main()
{
	int a, b, flag;
	for (a = 100; a <= 200; a++)	//得到100到200間的所有數字
	{
		flag = 0;				 //先假設a為素數 
		int k;
		k = (int)sqrt((double)i);
		for (b = 2; b < k; b++)	 //注意,不要忘了自身也能被整除!
		{
			if (a % b == 0)
			{
				flag = 1;  //若出現不能整除的情況,則令flag為1 
				break;
			}

		}						//標記變量——flag
		if (0 == flag)
			printf("%d ", a);
	}
	return 0;
}

方法2

我在網上還看到一種思路——

大體與法1(未優(yōu)化版)一致,但是沒有用標記變量flag,而是判斷最終b是否等于a——

#include<stdio.h>

int main()
{
	int a, b;
	for (a = 100; a <= 200; a++)	
	{
		for (b = 2; b < a; b++)	
		{
			if (a % b == 0)
			break;
		}					
		if (b == a)	  //反正要全部遍歷一遍,不如把代碼寫得短一點~
			printf("%d ", a);
	}
	return 0;
}

注意:判斷最終的b是否等于a

這里為何判斷的是b等于a而非b等于a-1呢?

例如:當a=101時,進入第二個for循環(huán),進行大量遍歷后來到b=100,此時經過if判斷同樣不滿足條件,不進入if語句。

然后就要b++,得到b=101,那么b=101時不滿足b<a的條件,所以不再進入for循環(huán),直接進入判斷if(b= =a)語句,此時b與a相等。
走到這一步,說明a除了自身與1外沒有能被a整除的除數,因此a為素數。

簡言之,條件表達式的執(zhí)行次數總是比循環(huán)體的執(zhí)行次數多一次。

個人認為此方法不如標記函數思路簡潔,不過仍不失為一種獨特的思路。

方法3

PS:思路不變,形式變化

我們可以將給定一個數字a,判斷其是否為素數的這段邏輯封裝在一個自定義函數中。

以下是代碼實現——

#include<stdio.h>
int fun(int a);

int main()
{
	int a,ret;
	for (a = 100; a <= 200; a++)	//得到100到200間的所有數字
	{ 
		ret=fun(a);	 //ret為返回值,通過判斷ret的值確定a是否為素數
		if(ret==0)
		printf("%d ",a);
	}
	return 0;
}
int fun(int a)
{	int b;
	for (b = 2; b < a; b++)	
	{
		if (a % b == 0)
		return 1;	//若能被整除,則返回值為1,結束 
	}
	return 0;		//若不能被整除,則返回值為0,結束 
}

注意 return 1; 和 return 0; 的位置。

小結

  • 判斷素數起碼有三種方法
  • 特別注意標記函數的使用,靈活運行用自定義函數,注意分析for循環(huán)的邏輯順序,注意break;使用的位置,注意sqrt函數的參量類型及頭文件,注意簡化遍歷次數、優(yōu)化方案的思路。

總結 

到此這篇關于C語言素數(質數)判斷的3種方法的文章就介紹到這了,更多相關C語言素數質數判斷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue自定義指令最佳實踐教程分享

    Vue自定義指令最佳實踐教程分享

    Vue?3?顯著增強了自定義指令的功能,使其封裝更加靈活和易用,本文將分為基礎和進階兩部分,介紹如何實現常用的自定義指令,并提供最佳的項目組織方式,需要的朋友可以參考下
    2024-12-12
  • c++ int轉string方法

    c++ int轉string方法

    int 轉string的方法,用到了特分享一下方便需要的朋友
    2013-01-01
  • 淺析stl序列容器(map和set)的仿函數排序

    淺析stl序列容器(map和set)的仿函數排序

    有序的stl容器在工程中應用什么方便和廣泛,但是當我們需要自己的排序的時候,可以用仿函數來設置它
    2013-09-09
  • VC++ 中ListCtrl經驗總結

    VC++ 中ListCtrl經驗總結

    這篇文章主要介紹了VC++ 中ListCtrl經驗總結的相關資料,需要的朋友可以參考下
    2015-06-06
  • C++之IO類,文件輸入輸出,string流練習題

    C++之IO類,文件輸入輸出,string流練習題

    這篇文章主要介紹了C++實現IO類的幾道數組練習題,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • C語言實現頁面置換算法(FIFO、LRU)

    C語言實現頁面置換算法(FIFO、LRU)

    這篇文章主要介紹了通過C語言實現的兩種頁面置換算法:先進先出(FIFO)頁面置換算法和最近最久未使用(LRU)頁面置換算法。文中的代碼具有一定的學習或工作價值,快來跟隨小編學習一下吧
    2021-12-12
  • C語言中循環(huán)語句練習實例

    C語言中循環(huán)語句練習實例

    大家好,本篇文章主要講的是C語言中循環(huán)語句練習實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言gets()與fgets() 函數的區(qū)別

    C語言gets()與fgets() 函數的區(qū)別

    本文主要介紹了C語言gets()與fgets() 函數的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • 淺談C++如何求等差素數列

    淺談C++如何求等差素數列

    這篇文章主要介紹了淺談C++如何求等差素數列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • C++?Protobuf實現接口參數自動校驗詳解

    C++?Protobuf實現接口參數自動校驗詳解

    用C++做業(yè)務發(fā)開的同學是否還在不厭其煩的編寫大量if-else模塊來做接口參數校驗呢?今天,我們就模擬Java里面通過注解實現參數校驗的方式來針對C++?protobuf接口實現一個更加方便、快捷的參數校驗自動工具,希望對大家有所幫助
    2023-04-04

最新評論

郁南县| 祁阳县| 航空| 康平县| 托克托县| 铜陵市| 蒙阴县| 平罗县| 郎溪县| 二手房| 法库县| 威海市| 汝城县| 南川市| 琼中| 右玉县| 田阳县| 星座| 密云县| 鄂托克前旗| 海兴县| 商城县| 德庆县| 新密市| 南昌县| 滁州市| 黎城县| 延长县| 洛隆县| 武鸣县| 阿荣旗| 富宁县| 上栗县| 弥渡县| 东阿县| 定襄县| 平顶山市| 三都| 临海市| 高阳县| 集贤县|