C語言中如何判斷質(zhì)數(shù)
C語言判斷質(zhì)數(shù)
寫判斷質(zhì)數(shù)的程序時(shí),需特別注意邊界條件:
1.開始邊界條件:2作為第一位質(zhì)數(shù),不參與循環(huán);
2.循環(huán)主體:divisor += divisor % 2 +1代表當(dāng)除數(shù)divisor是奇數(shù)時(shí)+2,是偶數(shù)時(shí)+1;
3.結(jié)束邊界條件:當(dāng)divisor趨近n時(shí),即divisor=n-1或divisor=n-2,仍然沒有數(shù)能被n整除,那么可以判斷n為質(zhì)數(shù)
#include <stdio.h> int main() { int divisor; int n; scanf("%d",&n); // 輸入要判斷的數(shù) if (n == 2) { printf("YES"); } else { for (divisor = 2; divisor < n; divisor += (divisor % 2 + 1) ) { if (n % divisor == 0) { printf("NO"); // 當(dāng)出現(xiàn)能被1或自身之外整除時(shí) break; } else if (divisor == n - 1 || divisor == n-2) { printf("YES"); // 循環(huán)到 n-1 或 n-2 時(shí),仍然沒有被其他數(shù)整除 } } } return 0; }
C語言判斷素?cái)?shù)的函數(shù)
下列程序?qū)懥艘粋€(gè)判別素?cái)?shù)的函數(shù),在主函數(shù)輸入一個(gè)整數(shù),輸出是否為素?cái)?shù)的信息。
#include <stdio.h>? int main() ? ?{ ? ? ? int prime(int); ? ? ? int n; ? ? ? printf("請輸入一個(gè)整數(shù):"); ? ? ? scanf("%d",&n);?? ? ? ? ?if______________________ ? ? ? ? ? ? ? ?? ?? ? ? ? printf("%d 是素?cái)?shù)。\n",n); ? ? ?else ?? ? ? ? printf("%d 不是素?cái)?shù)。\n",n); ? ? ?return 0; ? ?} ? int prime(int n) ? { ? ? ?int flag=1,i; ? ? ?for(i=2;i<n/2&&flag==1;i++) ? ? ?if ______________________ ? ? ? ? ? ? ? ? ?? ? ? ?flag=0; ? ? ?________________________; ? ? }
經(jīng)分析,以上代碼使用flag的值來判斷輸入的n是否為素?cái)?shù),flag=1,n為素?cái)?shù);flag=0,n不是素?cái)?shù)。完善if條件語句,第一個(gè)if, 主函數(shù)中的if調(diào)用函數(shù),需要填入一個(gè)參數(shù),即prime(n); 第二個(gè)if,是判斷什么情況下flag=0,即輸入的整數(shù)不為素?cái)?shù),即(n/i==0),余數(shù)為0,可以整除;最后返回flag的值,return flag。
但是經(jīng)過運(yùn)行可以知道,n=4的時(shí)候,程序判斷4是素?cái)?shù),明顯是錯(cuò)誤的,n取0和1的時(shí)候同理,程序存在漏洞。
分析得知,在定義函數(shù)的過程中,for循環(huán)條件語句,i<=n/2&&flag==1才能正確運(yùn)行,同時(shí)添加if語句對0和1判斷。(前提輸入的n>=0,如果為負(fù)整數(shù),另加判斷條件,略)
正確代碼如下
#include <stdio.h> int main() { int prime(int);//函數(shù)聲明 int n; printf("請輸入一個(gè)整數(shù):\n"); scanf("%d",&n); if(prime(n)) { printf("%d 是素?cái)?shù)。\n",n); }else { printf("%d 不是素?cái)?shù)。\n",n); } return 0; } int prime(int n) //函數(shù)定義 { int flag = 1,i; if (n <= 1) //判斷0和1,需要先排除 flag = 0; //返回0值 for(i=2;i <= n/2 && flag == 1;i++) //n無法整除比n/2大的數(shù),flag=1為真,即為素?cái)?shù),繼續(xù)執(zhí)行 if (n%i == 0) //如果取余為0,則其可以整除,不是素?cái)?shù)。 flag=0; //標(biāo)記flag=0,非素?cái)?shù)。 return flag; }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++教程之a(chǎn)rray數(shù)組使用示例詳解
這篇文章主要為大家介紹了C++教程之a(chǎn)rray數(shù)組使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03詳解C++模擬實(shí)現(xiàn)priority_queue(仿函數(shù))
本文主要介紹了關(guān)于C++中優(yōu)先級(jí)隊(duì)列的模擬實(shí)現(xiàn),以及仿函數(shù)的使用,優(yōu)先級(jí)隊(duì)列是一種容器適配器,其第一個(gè)元素總是最大的,仿函數(shù)本質(zhì)是一個(gè)類,重載了operator(),可改變比較邏輯,同時(shí),文中還介紹了如何進(jìn)行類的比較,如日期類或其指針的比較,以及庫中sort函數(shù)的使用方法2024-10-10cmake跨平臺(tái)構(gòu)建工具的學(xué)習(xí)筆記
CMake是一個(gè)跨平臺(tái)的安裝/編譯工具,通過CMake我們可以通過簡單的語句來描述所有平臺(tái)的安裝/編譯過程,下面這篇文章主要給大家介紹了關(guān)于cmake跨平臺(tái)構(gòu)建工具的相關(guān)資料,需要的朋友可以參考下2023-02-02C語言簡明講解三目運(yùn)算符和逗號(hào)表達(dá)式的使用
三目運(yùn)算符,又稱條件運(yùn)算符,它是唯一有3個(gè)操作數(shù)的運(yùn)算符,有時(shí)又稱為三元運(yùn)算符。三目運(yùn)算符的結(jié)合性是右結(jié)合的;逗號(hào)表達(dá)式,是c語言中的逗號(hào)運(yùn)算符,優(yōu)先級(jí)別最低,它將兩個(gè)及其以上的式子聯(lián)接起來,從左往右逐個(gè)計(jì)算表達(dá)式,整個(gè)表達(dá)式的值為最后一個(gè)表達(dá)式的值2022-04-04