C語言求給定範圍內的所有素數代碼及解析

2021-02-08 Linux公社

問題描述

求給定範圍start〜end之間的所有素數。

問題分析

判定一個整數m是否為素數的關鍵就是要判定整數m能否被除1和它自身以外的任何其他整數所整除,若都不能整除,則m即為素數。

本題求的是給定範圍start〜end之間的所有素數,考慮到程序的通用性,需要從鍵盤上輸入start和end值,例如輸入start=1,end=1000,則所編寫的程序應能夠列印出1〜1000之間的所有素數。

算法設計

由問題分析可知,該問題考慮用雙層循環結構實現。

外層循環對start〜end之間的每個數進行迭代,逐一檢查其是否為素數。外層循環的循環變量用變量m表示,m即代表當前需要進行判斷的整數,顯然其取值範圍為start≤m≤end。

內層循環稍顯複雜,完成的功能是判斷當前的m是否為素數。設內循環變量為m,程序設計時i從2開始,直到為止。用i依次去除需要判定的整數m,如果m能夠被中的任何一個整數所整除,則表示i必然小於或等於,則可以確定當前的整數m不是素數,因此,應提前結束該次循環。如果n不能被中的任何一個整數所整除,則在完成最後一次循環後,i還需要加1,即,之後才終止循環。此時,可以確定當前的整數m為素數。

可以使用標誌位flag來監控內外循環執行的情況。在定義變量時將flag初值設為1,在內層循環中判斷時,如果m能夠被中的任何一個整數所整除,則在內循環中將flag設置為0。如果m不能被中的任何一個整數所整除,則在內循環中不會修改flag標誌的值,退出內循環後它的值仍為1。此時在外循環中對flag的值進行判斷,如果flag=0,則顯然當前的m不是素數,如果flag=1,則當前的m是素數,應該將其列印出來。

還需要注意的是,在外循環中,每次要進行下一次迭代之前,要先將flag標誌再次置為1。

程序流程圖:

下面是完整的代碼:

#include<stdio.h>
#include<math.h>
int main()
{
    int start, end, i, k, m, flag=1, h=0;
    do
    {
        printf("輸入 起始數字 和 結束數字:");
        scanf("%d%d", &start, &end);
    }while(!(start>0 && start<end));
    printf(".... (%d-%d)素數列表....\n", start, end);
    for(m=start; m<=end; m++)
    {
        k=sqrt(m);
        for(i=2; i<=k; i++)
            if(m%i==0)
            {
                flag=0;
                break;
            }
        if(flag)
        {
            printf("%-4d",m);
            h++;
            if(h%10==0)
                printf("\n");
        }
        flag=1;
    }
    printf("\n共有%d個素數\n", h);
    return 0;
}

運行結果:

輸入 起始數字 和 結束數字:1 200
.... (1-200)素數列表....
1  2  3  5  7  11  13  17  19  23 
29  31  37  41  43  47  53  59  61  67 
71  73  79  83  89  97  101 103 107 109
113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199
共有47個素數

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-11/155472.htm

相關焦點

  • 整數範圍內的素數表
    整數範圍內的素數表經過一個月的運算(不是我算的,是電腦算的),終於得到整數範圍(4位元組)內的所有素數表。
  • C語言求回文素數代碼及解析
    對於偶數位的整數,除了11以外,都不存在回文素數。即所有的4位整數、6位整數、 8位整數…都不存在回文素數。下面列出兩位和三位整數中包含的所有回文素數。兩位回文素數:11三位回文素數:101、131、151、181、191、313、353、373、383、727、757、787、 797、 919、 929本題要求解的問題是:求出所有不超過1000的回文素數。問題分析本題要使用判斷素數的方法,並且要解決如何求一個整數的迴文數。
  • C語言求梅森素數代碼及解析
    問題描述梅森數(Mersenne Prime)指的是形如2n-1的正整數,其中指數n是素數,即為Mn。如果一個梅森數是素數,則稱其為梅森素數。
  • C語言編程求解:1到1000之間所有的素數
    想法是寫一個循環,循環裡依次除以從2到這個數減1的所有的整數,如果都不能整除,說明這個數是素數;如果出現一個能整除的數,那麼這個數不是素數。(其實,判斷素數還可以優化,循環裡依次除以從2到這個數平方根的所有的整數就可以了。因為假設一個數n,除以2~根號n的整數,都不能整除,那麼除以根號n~n-1的整數也不能整數。在文章最後再貼上優化的代碼。)那怎麼判斷能不能整除呢?
  • C語言編程:驗證哥德巴赫猜想
    a = b + c(其中a是大於等於6的整數,b和c是素數)這個問題就等價於:對於一個給定的大於等於4的偶數a,怎麼找到素數b和c呢?可以用循環的方法,把b的值從3循環到a-3,那麼對應的c的值就是a-3到3。然後我們分別對每一組的b和c值進行是否是素數的判斷。
  • C語言 | 求100~200的素數​
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • C語言求水仙花數代碼解析
    問題描述輸出所有的「水仙花數」,所謂的「水仙花數」是指一個三位數其各位數字的立方和等於該數本身,例如153是「水仙花數」,因為:153 = 13 + 53 + 33。問題分析根據「水仙花數」的定義,判斷一個數是否為「水仙花數」,最重要的是要把給出的三位數的個位、十位、百位分別拆分,並求其立方和(設為s),若s與給出的三位數相等, 三位數為「水仙花數」,反之,則不是。算法設計「水仙花數」是指滿足某一條件的三位數,根據這一信息可以確定整數的取值範圍是 100〜999。
  • 我一 jiao 踹開了 C 語言的大門
    (輾轉相除法)4、求符合給定條件的整數集5、求水仙花數6、九九乘法表7、素數求和8、猜數遊戲第六周1、數據類型2、整數的位數3、整數與二進位4、整數的範圍5、整數的格式化6比如說第五周提到的求最大公約數、求水仙花數、九九乘法表這些?當然有,runoob.com 上有一百道經典的題目,並且給出了參考答案,我看了一下,還真不錯。如果能把這些習題全部做出來的話,那基本上可以自信的拍拍胸膛,信誓旦旦地說,自己是一名合格的 C 語言程式設計師了。下面是網址。
  • 一次找出範圍內的所有素數,埃式篩法是什麼神仙算法?
    這個我沒記錯在C語言的練習題當中出現過,總之非常簡單,可以說是最簡單的算法了。埃式篩法的思路非常簡單,就是用已經篩選出來的素數去過濾所有能夠被它整除的數。這些素數就像是篩子一樣去過濾自然數,最後被篩剩下的數自然就是不能被前面素數整除的數,根據素數的定義,這些剩下的數也是素數。
  • 你不知道的素數判斷方法
    素數判斷?這不是小學學的嗎?您先別著急,不管您是小學,初中還是高中,從事什麼職業,我相信,堅持看完你一定有收穫![C語言必知必會]素數的判斷我們要判斷素數,首先要知道素數的定義。那我們就可以用一個循環,從2開始遍歷到這個數減去1,如果這個數都不能被整除,那麼這個數就是素數。 也就是說: 給定一個數 n , i 從 2 開始取值,直到 n - 1(取整數),如果 n % i !
  • C語言求最大公約數代碼及解析
    問題描述從鍵盤輸入兩個整數,求任意兩個正整數的最大公約數(GCD)。
  • C語言從入門到放棄(5)
    循環結構的特點是:在給定條件成立時,反覆執行某程序段,直到條件不成立為止。給定的條件成為循環條件,反覆執行的程序段稱為循環體。C語言的循環體語句有while語句、do-while語句、for語句。2.while語句while語句用於實現「當」型循環結構。
  • C++語言素數原理
    /* 學習內容:輸入一個32位的整數,列印出到該數範圍內的所有素數。 只能被1和自身整除的數為素數 語言:C++*/#include <iostream> //C語言中的stdio.h#include <cmath> //C語言中的math.h#include <climits> //C語言中的limits.h#include
  • 寫出高效優美的單片機C語言代碼
    程序能跑起來並不見得你的代碼就是很好的c代碼了,衡量代碼的好壞應該從以下幾個方面來看1,代碼穩定,沒有隱患。當然,在定義變量後不要超過變量的作用範圍,如果超過變量的範圍賦值,C編譯器並不報錯,但程序運行結果卻錯了,而且這樣的錯誤很難發現。在ICCAVR中,可以在Options中設定使用printf參數,儘量使用基本型參數(%c、%d、%x、%X、%u和%s格式說明符),少用長整型參數(%ld、%lu、%lx和%lX格式說明符),至於浮點型的參數(%f)則儘量不要使用,其它C編譯器也一樣。
  • LabVIEW編程實例:如何求解1000以內的所有素數
    素數有無窮多個,那麼在LabVIEW中如何編程實現求解1000以內的所有素數呢?,若x是素數,則布爾值為真,反之為假,其框圖程序的實現代碼如下:在上面代碼中,使用for循環,循環次數為(根號下x)-1,其中,對x開根號後要向下取整並強制轉換為一個32位的整數類型。
  • C語言求高次方數的尾數代碼解析
    問題描述求13的13次方的最後三位數。
  • C語言 | 判斷是否素數
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • C++編程靈活使用while循環和for循環來求出100以內的所有素數
    /*******************************************題目:把100以內(不包括100)的所有素數都列印到屏幕上,並且求出素數的個數是多少?素數釋義:在大於1的整數中,只能被1和這個數本身整除的數,如2、3、5、7、11。也叫質數。
  • C程序設計的常用算法
    通常使用自然語言、結構化流程圖、偽代碼等來描述算法。   一、計數、求和、求階乘等簡單算法   此類問題都要使用循環,要注意根據問題確定循環變量的初值、終值或結束條件,更要注意用來表示計數、和、階乘的變量的初值。
  • Python如何判斷一個正整數是否是素數?
    雖然通過上述方法,已經能讓我們在根號級別的複雜度內,判斷一個正整數是否為素數。但是我們其實還可以做得更快!回到我們最初的起點,我們之所以要枚舉這些數,就是想找出原數的約數。然後除1外,任何一個正整數都能寫成多個素數的乘積的形式,所以我們枚舉特定範圍內的所有素數,也能達到相同的效果,而且數字範圍越大,其區間內素數個數和區間長度之比也將越來越小,大家可以看看下面不同區間內的素數統計結果:從上圖的統計結果我們可以發現,我們用區間內的素數去判斷一個整數是否素數,比較的次數相較之前來說更少。