素數統計及求和

素數

素數百度百科:

質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱爲合數。


引入

本題要求實現一個判斷素數的簡單函數、以及利用該函數計算給定區間內素數和的函數。素數就是隻能被1和自身整除的正整數。注意:1不是素數,2是素數。

計素數並求和:輸入 2 個正整數 m 和 n(1≤m≤n≤500),統計 並輸出 m 和 n 之間素數的個數以及這些素數的和。 素數就是隻能被 1 和自身整 除的正整數,1 不是素數,2 是素數


分析

第一題沒有規定區間,我們需要考慮當m、n的區間

  • 什麼素數(上面很清楚),我們可以寫一個函數判斷它是否是質數
  • 判斷素數分三個區間 <=1、==2、>2

第二題有區間

  • 思考怎麼減少循環次數sqrt(m)

c(該區間素數之和1)

#include <stdio.h>
#include <math.h>
int prime( int p );
int PrimeSum( int m, int n );

int main()
{
    int m, n, p;

    scanf("%d %d", &m, &n);
    printf("Sum of ( ");
    for( p=m; p<=n; p++ ) {
        if( prime(p) != 0 )
            printf("%d ", p);
    }
    printf(") = %d\n", PrimeSum(m, n));

    return 0;
}

/**
寫了這麼多,也看懂套路,我們寫的聲明函數的封裝,主函數調用封裝函數就ok了
*/

//傳入一個數判斷是否是素數,爲素數時返回1,否則返回0
int prime( int p ){
    //如何判斷是否是素數,素數是除了1和它本身之外能夠被其他數整除,在數學中1不是素數,2是素數
    //與三個區間 <=1 =2 >2
    
    //小於等於1的數都不是素數,2是素數
    if(p <= 1){
    	return 0;
	} else if(p == 2){
		return 1;
	}else{
       //判斷2以上的數是否是素數
        int i;
        for(i = 2; i < p; i++){
            if(p%i == 0){
                return 0;
            }
        }
        return 1;
    }
}

//統計該區間素數之和,函數PrimeSum返回區間[m, n]內所有素數的和。題目保證用戶傳入的參數m≤n
int PrimeSum( int m, int n ){
    //自定義m≤n
    int t =0;
    if(m > n){
        t = m;
        m = n;
        n = t;
    }
    
   //定義變量接收m的值,定義變量統計素數之和
   int sum=0;
   for(; m <= n; m++){
       if(prime(m)){
        sum+=m;
       }
   }
   //返回素數之和
   return sum;
}

c(該區間素數之和2)

#include <stdio.h>
#include <math.h>
 
int main ()
{
	/**
	計素數並求和:輸入 2 個正整數 m 和 n(1≤m≤n≤500),統計 並輸出 m 和 n 之間素數的個數以及這些素數的和。
	素數就是隻能被 1 和自身整 除的正整數,1 不是素數,2 是素數。試編寫相應程序。 
	*/
	
	int m,n;
	scanf("%d%d",&m,&n);
	
	int i,j,count=0;
	double sum;
	for(;m <= n; m++){
		
		/**
		因爲素數只能被1和它本身整除,但是網上很多人把那個數開平方 
		來看看開平方有什麼好處,舉個例子 
		3 - 16的素數:  3 ,5,7,11,13 判斷結果變成了 i < 4
		17 - 36的素數:	17,19,23,31  判斷結果變成了 i < 6 
		將 < n 變爲 <= sqrt(n) 並不是隨意寫的,這樣寫是總結出來的,能夠減少循環的次數 
		*/ 
		j = sqrt(m);
		for(i = 2; i <= j; i++){
			if(m % i == 0)break;	
		}
		
		//執行完內層循環之後 i>j,同時1不是素數 
		if(i > j && m != 1){
			sum += m;
			count++;
		}
	
	}
	
	printf("m-n區間內有%d個素數\n",count);
	printf("m-n區間內素數的和是%.2lf",sum);
	 
	return 0; 
}

在這裏插入圖片描述


java

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        Scanner scanner1 = new Scanner(System.in);
        int b = scanner1.nextInt();

        //定義變量count統計質數個數,計算質數之和
        int count = 0, sum = 0;

        //自定義a<b
        a = a>b?b:a;
        b = a<b?b:a;

        if(a == b) {
            System.out.println("你輸入的區間有問題");
        }

        //在數學中1不是素數、2是素數比較特殊,我們單獨處理
        if(a == 1 && b == 2){
            count = 1;
            System.out.println("該區間有1個質數");
            System.out.println("該區間質數之和:2");
        }else if(a == 1) {
            //循環傳入兩數的區間
            for(; a <= b; a++) {
                //如果是質數進行加1操作
                if(isprime(a)){
                    count++;
                    sum+=a;
                }
            }
            System.out.println("該區間有"+--count+"個質數");
            System.out.println("該區間質數之和:"+(sum-1));
        }else {
            //循環傳入兩數的區間
            for(; a <= b; a++) {
                //如果是質數進行加1操作
                if(isprime(a)){
                    count++;
                    sum+=a;
                }
            }
            System.out.println("該區間有"+count+"個質數");
            System.out.println("該區間質數之和:"+sum);
        }
    }

    //驗證改數是否是質數
    public static boolean isprime(int a){
        //如何判斷是否是質數,素數就是質數,一個大於1的數,除了它本身和 1之外,不能被其他自然數整除
        for(int i = 2; i < a; i++) {
            if (a%i==0) {
                return false;
            }
        }
        return true;
    }

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章