PAT1007,1008

使用语言:C++

PAT1007 素数对猜想 (20 分)

让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

解题思路:

根据读入的n得到在1-n范围内的所有素数,存入数组。之后相减算素数对,输出结果。

(中间最后一个数据一直超时,检查了代码判断素数的循环结束为i,而素数只需检测到i的平方根)

代码:

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
	//count一个记录素数个数,一个记录素数对个数
	int n, prime[100001], count1 = 0,count2 = 0;
	cin>>n;

	//寻找素数
	for(int i = 2;i <= n; i++){
		int flag = true;//是否为素数
		for(int j = 2;j <= sqrt(i); j++){
			if(i % j == 0){
				flag = false;
				break;
			}
		}
		if(flag){
			prime[count1++] = i;//素数存入数组
		}
	}

	//计算素数对
	for(int k = 0;k < count1; k++){
		if(prime[k+1] - prime[k] == 2){
			count2++;
		}
	}
	cout<<count2<<endl;

	return 0;
}

PAT1008 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

解题思路:

有很多种方法解此题。虽然他说移动尽可能少,但你也可以直接暴力循环移动(反正也不知道),不过这种大概会超时。

由于题目说尽量少移动,于是我就没有移动,将数字存好,然后根据m判断移动后的第一个数字然后输出,再把数组中第一个到这个点的数字输出。

还有一种也不移动的方法是存入数组时就判断,将移动后的第一个存到数组第一个,之后循环输出就好。

ps.提示m可能大于n,需要取模。

代码:

#include <iostream>

using namespace std;

int main()
{
	int n,m,num[101];
	cin>>n>>m;
    //读入数字
	for(int i = 0;i < n; i++){
		cin>>num[i];
	}

    //从移动后第一个输出
	for(int j1 = n - m % n;j1 < n;j1++){
		cout<<num[j1]<<" ";
	}
    //从数组第一个输出到移动后第一个之前
	for(int j2 = 0;j2 < n - m % n - 1;j2++){
		cout<<num[j2]<<" ";
	}
	cout<<num[n - m % n - 1]<<endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/winsumer/article/details/88635721