使用语言:C++
PAT1007 素数对猜想 (20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N
(<105),请计算不超过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中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−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;
}