给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
2014-08-25 10:17
29 查看
给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
题目解析:
可以先求出所有的质数,然后两两相加,求得结果。那么求解质数时,就要对每一个6...N之间的数k,然后判断i由2...k,判断是不是k/i == 0。
那么有没有更好的方法?筛子法。但需要额外的辅助空间。
先以一个例子来讲解筛子法:求2-100间的所有质数。
方案:把所用的依次摆开,再依次筛掉2,3,5,7。。。。。。到47的倍数。不能用乘除只能用加减以加快速度。
那么对于这道题目,也可以利用这个方法来做:先求出所有的数组,然后让两两素数相加,在相应的偶数的索引下标记为1。
题目解析:
可以先求出所有的质数,然后两两相加,求得结果。那么求解质数时,就要对每一个6...N之间的数k,然后判断i由2...k,判断是不是k/i == 0。
那么有没有更好的方法?筛子法。但需要额外的辅助空间。
先以一个例子来讲解筛子法:求2-100间的所有质数。
方案:把所用的依次摆开,再依次筛掉2,3,5,7。。。。。。到47的倍数。不能用乘除只能用加减以加快速度。
#include <stdio.h> int main(void) { int a[101],i,j; //n+1 for(i=2;i<=100;i++) //全部赋值 a[i]=i; for(i=2;i<=50;i++) //筛掉i的倍数 { if(a[i]!=0) //加上这一句是为了加快速度 for(j=i+i;j<=100;j+=i) a[j]=0; } for(i=2;i<=100;i++) //对不为0的元素进行输出 if(a[i]!=0)printf("%3d",a[i]); printf("\n\n"); return 0; }
那么对于这道题目,也可以利用这个方法来做:先求出所有的数组,然后让两两素数相加,在相应的偶数的索引下标记为1。
#include<iostream> using namespace std; //筛子法求质数 可以参考亲和数 //6~N的质数,打印两两质数为偶数的所有这些偶数 //因为质数除开2以外都是奇数,那么大于6的偶数都是奇数,那么把6~N之间的质数都求出来,打印两两的和就可以了。 int main(){ cout << "输入N,产生的质数不大于范围 (6~N): "; int n; cin >> n ; int *array = new int[n+n+1];// 定义array是一个数组指针 //init for (int i = 0; i <= n+n ; i++) array[i]=i; for(int i =2; i*i <= n; i++) for(int j=i+i; j <= n ; j+=i) array[j]=0; int count=0; //统计质数的个数 for (int i = 6; i <= n ; i++){ if(array[i] == i){ cout << array[i]<< " "; count++; } } cout<<endl<<"一共有"<<count<<"个质数"; cout <<endl<<"打印所有两两和为偶数,打印所有偶数 "<<endl; //打印 两两之和为偶数的所有偶数 for (int i = 6; i <= n ; i++){ for (int j = i+1; j <= n ; j++) if(array[i] == i&&array[j] == j){ int sum= array[i] + array[j]; array[sum]=1; } } for (int i = 6+6; i <=n + n ; i++){ if(array[i] == 1) cout << i << " "; } system("pause"); return 0; }
相关文章推荐
- [经典面试题]给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数(百度2014,面试)
- 给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数
- 算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
- 算法题:给你一个自然数N,求[6, N]之内的所有素数中, 两两之和为偶数的那些偶数。
- 算法题:给你一个自然数N,求[6, N]之内的全部素数中, 两两之和为偶数的那些偶数。
- 输入一个偶数N,输出所有素数对之和等于N的素数对
- 判断101-200之间有多少个素数,并输出所有素数。素数为一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
- 找出MXN数组中所有不相邻元素,并求出它们的和(相邻的数:前一个数是偶数,后一个数是素数)
- 验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。请输入一个偶数,将其表示成两个素数之和。
- 任意给定一个自然数N,要求M是N的倍数,且他的所有各位数字都是由0或1组成,并要求M尽可能小
- 输入一个整数数组,返回所有元素两两之差绝对值最小的值,O(n)算法
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
- 一个偶数总能表示为两个素数之和
- 一个根据筛选法求出100以内的所有素数的小程序
- 验证任意一个大于4并且小于500的偶数都可以拆分成两个素数之和
- 将一个偶数分解为两个素数的和并打印
- 给定一个整数,打印出它的所有素数因子--两种方法,两种效率。
- Console-算法-一个偶数总能表示为两个素数之和
- 歌德巴赫猜想的C语言和Java语言版源程序(给出任何一个大于6的偶数写出两个素数之和)