PAT1007 素数对猜想
传送门
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为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上的代码一直没有输出,但是提交是正确的。