素数求和问题

来源:互联网 发布:数据库人员报表查询 编辑:程序博客网 时间:2024/06/01 08:55

描述
现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和。
输入
第一行给出整数M(0<M<10)代表多少组测试数据
每组测试数据第一行给你N,代表该组测试数据的数量。
接下来的N个数为要测试的数据,每个数小于1000
输出
每组测试数据结果占一行,输出给出的测试数据的所有素数和
样例输入
351 2 3 4 5811 12 13 14 15 16 17 181021 22 23 24 25 26 27 28 29 30
样例输出
104152

解题思路:做这道题时,我的算法超时,借鉴了别人的算法。首先采用筛法选素数,存在一个数组中。输入待判断的数,利用二叉法遍历数组,如果不在数组中,寻找最接近的两个素数,判断距离寻找最近的素数。


#include<stdio.h>int a[10000001]={0};int main(){int i,j,len=0;//对不是素数的进行标记for(i=2;i<1000001;i++)if(a[i]==0){for(j=i+i;j<1000001;j=j+i)a[j]=1;}//将素数存进数组中for(i=2;i<1000001;i++)if(a[i]==0){a[len]=i;len++;}int T;scanf("%d",&T);while(T--){int n,low=0,end=len-1,mid;scanf("%d",&n);//二叉法遍历while(low<=end){mid=(low+end)/2;if(a[mid]==n){printf("%d 0\n",n);//输入值为素数时,直接输出break;}else if(a[mid]<n)low=mid+1;elseend=mid-1;}//输入值不为素数,进行判断,此时low>endif(low>end){if(n==1)printf("2 1\n");else if(a[low]-n>=n-a[end])printf("%d %d\n",a[end],n-a[end]);elseprintf("%d %d\n",a[low],a[low]-n);}}return 0;}

经验:做过这道题后,学会了筛法选素数,也有了将一个数组中的数进行删除的思路。


原创粉丝点击