很多坑的题目PAT1007

这道题是真的有坑,毕竟我没有使用动态数组,这是我编程习惯的弊端,在日后的编程学习过程中我会努力改变自己的,毕竟这种碰巧申请数组大小满足数据大小的事只有在数据很小的时候能够呈现。
问题:
1007 素数对猜想 (20 分)
让我们定义d​n为:dn=p​n+1−p​n ,其中p​i是第i个素数。显然有d =1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10的​5方),请计算不超过N的满足猜想的素数对的个数
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数

#include<iostream>
#include<math.h>
using namespace std;
int main() {
	int memory=0;//记录输出的数,及那个所谓的素数对
	int N;//记录输入的数
	int cont = 0, mask = 0;//数组执行数,记录数标
	int keep[10000] = { 0 };//保存在范围内的素数值
	int n = 0;
	cin >> N;
	if (0 < N && N <= 3) {
		memory = 0;
		cout << memory;
	}
	if (N > 2) {
		keep[0] = 2;
		for (int i = 3; i <= N; i++) {//找出素数
			for (int j=2; j <= int(sqrt(i) + 1); j++) {//判断i是否是素数
				if (i%j == 0)
					mask++;
			}
			if (mask == 0)
				keep[++cont] = i;//记录数组填充素数
			if (mask != 0)
				mask = 0;
		}
		for (int k = 0; keep[k + 1] != 0; k++) {
			if ((keep[k + 1] - keep[k]) ==2)
			memory++;
		}
		cout << memory;
	}
	
	cin >> N;
	return 0;
}

实现题目时的时候出现问题较多:

  • 数组的大小要求,刚开始设置数组大小为100,结果说在对大数来使用该程序出现内存不足。
  • 还有个一直没有解决的问题,但是换了解决方案完成了替代,就是读取数组keep[i]!=‘\0’,出现问题。
  • 总结下该题目的实现关键点和考察点,就是素数的判断,关于素数的判断,简单直接的办法从2~n-1(n为考察的数)只需要挨个的除就好了,如果能够找到非1与本身的因数自然不是素数。当然这样的计算量太大,我们可以简化就是只需要除到n/2就好(毕竟n/2以后不可能还有n的因数),其实我们还可以缩小这个检索因数的范围到√n就好(为什么具体证明我就不证明了)

对于第二点,欢迎大神来指正解答。

猜你喜欢

转载自blog.csdn.net/github_38591120/article/details/86592888