素数求和
来源:互联网 发布:淘宝潮牌 编辑:程序博客网 时间:2024/06/08 03:14
算法提高 素数求和
时间限制: 1 Sec 内存限制: 256 MB
题目描述
输入一个自然数n,求小于等于n的素数之和
输入
2
输出
2
样例输入
2
样例输出
2
提示
数据规模和约定
测试样例保证 2 <= n <= 2,000,000
来源
思路:这里有两种解法,第一种就是较为常用的,时间复杂度高。第二种是用了筛法求素数,筛法其实就是以空间换时间的一个最好的证明。空间复杂度增加了,时间复杂度降低了。这和斐波那契数列求解类似,如果用递归,那么时间复杂度很慢,如果将用数组存储一个斐波那契数列,则时间复杂度降低到线性。
第一种解法:
#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>using namespace std;int prime(int n){ int i; if(n==0||n==1) return -1; if(n==2||n==3) return 1; for(i=2;i*i<=n;i++)//因为这个地方处理不当错过几次 if(n%i==0) break; if(i>sqrt(n)) return 1; return -1;}int main(){ int n,i; long long int s=0; cin>>n; for(i=2;i<=n;i++) if(prime(i)==1) s+=i; //cout<<s<<endl; printf("%lld\n",s); return 0;}
第二种解法:(筛法求素数)#include<iostream>#include<string.h>#include<math.h>using namespace std;int a[2000000]={0};int main(){ int n,i,j; cin>>n; for(i=2;i<=2000000;i++) { if(a[i]==1) continue; else { for(j=i+i;j<=2000000;j+=i) { if(j%i==0) a[j]=1;} } } long long int sum=0; for(i=2;i<=n;i++) { if(a[i]==0) { sum+=i; } } cout<<sum<<endl; return 0;}
0 0
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- 素数求和
- HTML中让表单input等文本框为只读不可编辑的方法汇总
- hdoj2002
- 【小梅哥FPGA进阶教程】第九章 基于串口猎人软件的串口示波器
- Oracle trunc()函数的用法
- 阿里java规范整理
- 素数求和
- SpringBoot17 之Interceptor
- TextView具备长按编辑功能,返回键可保存当前编辑内容
- TinyPNG---一个压缩PNG的神站
- 线段树 单点增减/替换,区间查询
- redis之lpush、rpush、lset、lrem
- 数组、链表、堆栈和队列
- 排列平方数
- 处理AppCompatActivity中openOptionsMenu方法无效的问题