素數
素數百度百科:
質數又稱素數。一個大於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;
}