PAT1007 素数对猜想

传送门
让我们定义dn为:dn=p​n+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有d​n​​ 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10^​5​​ ),请计算不超过N的满足猜想的素数对的个数。

输入

输入在一行给出正整数N

20

输出

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

4

代码

#include<iostream>
#include<math.h>
#include<stdio.h>
#include<vector>
using namespace std;
int isPrime ( int x )//判断素数
{
	int sqr = sqrt( x );
	int flag = 1;
	for ( int i = 2;i <= sqr;i++ ){
		if ( x % i == 0 ){
			flag = 0;
		}
	}
	return flag;
}


int main(){
	int n;
	cin>>n;
	int m=0;
	vector<int> v; 
	
	for(int i=1;i<=n;i++){
		if(isPrime(i))
		v.push_back(i);
		}
	
	for(int j=0;j<v.size();j++){
		if(v[j]-v[j-1]==2)
		++m;
	}
	cout<<m;
	return 0;
} 

PAT1008 数组循环右移

一个数组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个整数,之间用空格分隔

6 2
1 2 3 4 5 6

输出

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

5 6 1 2 3 4

代码

输入数组后,可以将前m个数组逆序,再将m-n逆序,最后再将整个数组逆序。
如1 2 3 4 5 6->1 2 3 4 6 5->4 3 2 1 6 5->5 6 1 2 3 4.

#include<iostream>
using namespace std;
void revise(int arr[],int left,int right){
	int temp=0;
	while(left<right){
		temp=arr[left];
		arr[left]=arr[right];
		arr[right]=temp;
		left++;
		right--;
	}

}
int main(){
	int n,m;
	cin>>n>>m;
	if(n<1||n>100||m<1) 
		return 0;
	int arr[n];
	for(int i=0;i<n;i++){
		cin>>arr[i];
	}

	revise(arr,n-m,n-1);
	revise(arr,0,n-m-1);
	
	revise(arr,0,n-1);
	for(int i=0;i<n;i++){
		cout<<arr[i];
		if(i!=n-1)cout<<" ";
	}
	
	return 0;
}

[注]此代码不能通过测试点2,3,目前还没找到修改方法

参考了大佬的思路,原来有封装好的逆序函数。
数组长度为n,要想把数组循环右移m位,只需要先将整个数组a倒置,再将数组前m位倒置,最后将数组后n-m位倒置即可完成循环右移m位~reverse函数可以实现将一个数组或者vector中元素倒置,这个函数在algorithm头文件中~(如果m大于n,那么循环右移m位相当于循环右移m%n位,因为那些n倍数位的移动是多余的,所以在使用m之前,先将m = m%n)

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    m %= n;
    if (m != 0) {
        reverse(begin(a), begin(a) + n);
        reverse(begin(a), begin(a) + m);
        reverse(begin(a) + m, begin(a) + n);
    }
    for (int i = 0; i < n - 1; i++)
        cout << a[i] << " ";
    cout << a[n - 1];
    return 0;
}

PAT1009 说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

Hello World Here I Come

输出

Come I Here World Hello

代码

#include<iostream>
#include <stack>
using namespace std;
int main() {
    stack<string> v;
    string s;
    while(cin >> s) v.push(s);
    cout << v.top();
    v.pop();
    while(!v.empty()) {
        cout << " " << v.top();
        v.pop();
    }
    return 0;
}

[注] 不知道为啥在dev上的代码一直没有输出,但是提交是正确的。
image.png