1. 程式人生 > >素數求和問題

素數求和問題

足夠 href pre pid ins 數組 name ace 問題

原題鏈接(素數求和問題)

時間限制:3000 ms | 內存限制:65535 KB 難度:2
描述
現在給你N個數(0<N<1000),現在要求你寫出一個程序,找出這N個數中的所有素數,並求和。
輸入
第一行給出整數M(0<M<10)代表多少組測試數據
每組測試數據第一行給你N,代表該組測試數據的數量。
接下來的N個數為要測試的數據,每個數小於1000
輸出
每組測試數據結果占一行,輸出給出的測試數據的所有素數和
樣例輸入
3
5
1 2 3 4 5
8
11 12 13 14 15 16 17 18
10
21 22 23 24 25 26 27 28 29 30
樣例輸出
10
41
52
 1 #include<iostream>
 2
#include<cmath> 3 using namespace std; 4 int main(){ 5 int M,N,a,flag,sum; 6 cin>>M; 7 while(M--){ 8 cin>>N; 9 sum=0; 10 for(int i=0;i<N;i++){ 11 cin>>a; 12 flag=0; 13 if(a==1) 14 continue
; 15 for(int j=2;j<=sqrt(a);j++) 16 if(a%j==0) 17 flag=1;//如果a不是素數,flag標記1 18 if(flag==0) 19 sum+=a; 20 } 21 cout<<sum<<endl; 22 } 23 return 0; 24 }

優化:

 1 //素數打表,時間上更優化 
 2 #include<iostream>
 3
int a[1010];//每個數小於1000,數組開到1010足夠 4 int b[1010];//存放素數 5 using namespace std; 6 void prime(){ 7 for(int i=2;i<=1010;i++) 8 b[i]=1; 9 b[1]=0;//1不是素數 10 for(int i=2;i<=1010;i++) 11 for(int j=i+i;j<=1010;j+=i) 12 b[j]=0;//不是素數標記0,其余為1是素數 13 } 14 int main(){ 15 int N,M,sum; 16 cin>>M; 17 while(M--){ 18 cin>>N; 19 int sum=0; 20 prime(); 21 for(int i=0;i<N;i++){ 22 cin>>a[i]; 23 if(b[a[i]]==1) 24 sum+=a[i]; 25 } 26 cout<<sum<<endl; 27 } 28 return 0; 29 }

素數求和問題