C語言程序設計100例之(11):求質數

例11  求質數

問題描述編程

質數是指除了有1和自身做爲約數外,再也不有其餘約數的數。好比:三、五、7是質數。而9不是質數,由於它還有約數3。函數

編寫程序求給定區間中的全部質數。spa

輸入格式數學

兩個整數a和b,其中1≤a≤b≤100000。io

輸出格式原理

輸出給定範圍的全部質數,輸出時每一個質數佔5列,每行輸出10個質數。循環

輸入樣例程序

100  200方法

輸出樣例im

101  103  107  109  113  127  131  137  139  149 

151  157  163  167  173  179  181  191  193  197

199

        (1)編程思路

判斷一個數m是否爲質數的方法是:用2~sqrt(m)中的每個整數i去除m,若某一個i能整除m,則m不是質數;不然,m是質數。該操做可定義爲一個函數,以下:

int isPrime(int m)

{

    int i;

    if (m==1) return 0;

    for (i=2;i<=sqrt(1.0*m);i++)

        if (m%i==0)  return 0;

    return 1;

}

求a~b之間的全部質數,寫成一個循環,在循環中調用函數isPrime判斷每一個整數i是否爲質數,如果,則計數並輸出。

(2)源程序。

#include <stdio.h>

#include <math.h>

int isPrime(int m)

{

    int i;

    if (m==1) return 0;

    for (i=2;i<=sqrt(1.0*m);i++)

        if (m%i==0)  return 0;

    return 1;

}

int main()

{

    int i,a,b,cnt=0;

    scanf("%d%d",&a,&b);

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

    {

        if (isPrime(i))

        {

            cnt++;

            printf("%5d",i);

            if (cnt%10==0) printf("\n");

        }

    }

    return 0;

}

習題11

11-1  迴文質數

問題描述

我國古代有一種迴文詩,倒唸順念都有意思,例如「人過大佛寺」,倒讀起來即是「寺佛大過人」。還有經典的對聯「客上自然居,竟然天上客」等。在天然數中,若是一個數從左向右讀或是從右向左讀徹底一致,這樣的天然數稱爲迴文數。

編寫一個程序,找出N以內的全部迴文質數。所謂迴文質數就是一個數便是一個質數又是一個迴文數,例如,151 是迴文質數。

輸入格式

一個整數N,其中1≤N≤100000。

輸出格式

輸出N之內的全部迴文質數,輸出時每一個迴文質數佔5列,每行輸出10個迴文質數。

輸入樣例

10000

輸出樣例

     2    3     5    7    11  101   131   151   181   191

   313  353   373  383   727  757   787   797   919   929

  (1)編程思路。

將判斷一個數是否爲質數和是否爲迴文數分別寫成一個函數。

函數int isPrime(int m);判斷數m是否爲質數,m是質數,函數返回值爲1,不然爲0。

函數int isPalm(int m); 判斷數m是否爲迴文數,m是迴文數,函數返回值爲1,不然爲0。

  (2)源程序。

#include <stdio.h>

#include <math.h>

int isPrime(int m)

{

    int i;

    if (m==1) return 0;

    for (i=2;i<=sqrt(1.0*m);i++)

        if (m%i==0)  return 0;

    return 1;

}

int isPalm(int m)    // 判斷m是否爲迴文數

{

    int a,b;

    a=m; b=0;

    while (a>0)

    {

          b=b*10+a%10 ;

          a = a/10;

    }

    return b==m;

}

int main()

{

    int i,n,cnt=0;

    scanf("%d",&n);

    for (i=1;i<=n;i++)

    {

        if (isPalm(i) && isPrime(i))

        {

            cnt++;

            printf("%5d",i);

            if (cnt%10==0) printf("\n");

        }

    }

    return 0;

}

        從程序運行結果能夠看出,迴文質數除了11之外,全部迴文質數的位數都是奇數。這是由於,若是一個迴文數的位數是偶數,則它的奇數位上的數字之和與偶數位上的數字之和必然相等。根據數的整除性原理,這樣的數確定能被11整除。所以,迴文質數的位數毫不多是偶數(除11外)。

11-2  第N個質數

問題描述

質數就是不能再進行等分的整數。好比:7,11是質數。而9不是質數,由於它能夠平分爲3等份。通常認爲最小的質數是2,接着是3,5,...

設「2」 是第一個質數,「3」 是第二個質數,依此類推。問第N個質數是多少?

輸入格式

一個整數N,其中1≤N≤1000000。

輸出格式

一個整數,它是第N個質數。

輸入樣例

10

輸出樣例

29

        (1)編程思路。

        先處理n=1,輸出2的特殊狀況。由於,2以後的全部質數均爲奇數。

        記當前質數個數cnt=1(2是第1個質數),從i=3開始,順序判斷當前奇數是否爲質數,如果質數則cnt++,若cnt==n,則當前奇數爲第n個質數,結束循環查找並輸出結果。

        (2)源程序。

#include <stdio.h>

#include <math.h>

int isPrime(int m)

{

    int i;

    if (m==1) return 0;

    for (i=2;i<=sqrt(1.0*m);i++)

        if (m%i==0)  return 0;

    return 1;

}

int main()

{

   int n,i,cnt;

   scanf("%d",&n);

   if (n==1) printf("2\n");

   else

   {

       cnt=1; i=3;

       while(1)

       {

          if (isPrime(i)) cnt++;

          if(cnt==n) break;

          i+=2;

       }

       printf("%d\n",i);

   }

   return 0;

}

11-3  哥德巴赫猜測(升級版)

題目描述

1742年6月7日哥德巴赫寫信給當時的大數學家歐拉,正式提出瞭如下的猜測:任何一個大於9的奇數均可以表示成3個質數之和。質數是指除了1和自己以外沒有其餘約數的數,如2和11都是質數,而6不是質數,由於6除了約數1和6以外還有約數2和3。須要特別說明的是1不是質數。

這就是哥德巴赫猜測。歐拉在回信中說,他相信這個猜測是正確的,但他不能證實。

今後,這道數學難題引發了幾乎全部數學家的注意。哥德巴赫猜測由此成爲數學皇冠上一顆可望不可及的「明珠」。

如今請你編一個程序驗證哥德巴赫猜測。

輸入格式

僅有一行,包含一個正奇數n,其中9<n<20000。

輸出格式

僅有一行,輸出3個質數,這3個質數之和等於輸入的奇數。相鄰兩個質數之間用一個空格隔開,最後一個質數後面沒有空格。若是表示方法不惟一,請輸出第一個質數最小的方案,若是第一個質數最小的方案不惟一,請輸出第一個質數最小的同時,第二個質數最小的方案。

輸入樣例

2009

輸出樣例

3 3 2003

        (1)編程思路。

        對輸入的正奇數n,先判斷其和是否含有質數2,只有一種可能2+2+(n-4),若n-4是質數,則直接輸出結果,結束。

        若是n的和值中不包含質數2,則只能分解爲3個奇數之和。不妨設n=i+j+(n-i-j)。用一個二重循環尋找答案。外循環i爲3~n/3之間的全部奇數,內循環j爲i~n/3之間的全部奇數,在內循環中調用函數isPrime判斷,若i、j、n-i-j三個數均爲質數,則找到答案,輸出並結束。

        (2)源程序。

#include <stdio.h>

#include <math.h>

int isPrime(int m)

{

        int k,i;

        k=sqrt(1.0*m);

        for  (i=2;i<=k;i++)

            if (m%i == 0)   return 0;

         return 1;

}

int main()

{

    int n,i,j,flag=0;

    scanf("%d",&n);

    if (isPrime(n-4)==1)

    {

        printf("%d %d %d\n",2,2,n-4);

        return 0;

    }

    for (i=3;i<=n/3;i+=2)

    {

        if (isPrime(i)==0) continue;

        for (j=3;j<=n/3;j+=2)

            if (isPrime(j) && isPrime(n-i-j))

            {

                  flag=1;  break;

            }

           if (flag==1) break;

    }

    printf("%d %d %d\n",i,j,n-i-j);

    return 0;

相關文章
相關標籤/搜索