标签:包括 大于 集合 问题 logs name color 应该 style
问题描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
输入包括一个整数n,(3 ≤ n < 1000)
输出描述:
输出对数
#include<iostream> #include<math.h> using namespace std; int IsPrime(int n); int main() { int N; cin>>N; int *arr=new int[N]; int j=0; int num=0; for(int i=2;i<=N;i++){ if(IsPrime(i)) { arr[j++]=i; } } for(int m=0;m<j;m++) for(int n=m;n<j;n++) { if(arr[n]+arr[m]==N) num++; } cout<<num; delete arr; return 0; } int IsPrime(int n){ if(n==1) return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; }
思路二:
若N是素数,那么N的倍数就都不是素数了,可以通过这种方法把素数筛选出来
2是素数,那么就把1-1000范围所有2的倍数置为0,此时v[2]、v[4]、v[6]、v[8]....都为0了;
下一次看到3是素数,则把v中3的倍数置为0,v[3]、v[6]、v[9]...都置为0;
下一个素数为5,因为在在第一步时,v[4]被置为0了,接下来把5的倍数都置为0
......
最后,v中素数都为1,非素数都为0
#include <iostream> #include <vector> using namespace std; int main(){ //筛选法求素数(删除所有素数的倍数) vector<int> v(1000,1); for(int i=2;i<1000;++i){ for(int j=2;i*j<1000;++j){ if(v[i]){ v[i*j]=0; } } } int x; cin>>x; int res=0; for(int i=2;i<=x/2;++i){ if(v[i]&&v[x-i]) ++res; } cout<<res<<endl; }
标签:包括 大于 集合 问题 logs name color 应该 style
原文地址:http://www.cnblogs.com/yfz1552800131/p/7497305.html