第2组 50min
PAT-B 1006 换个格式输出整数
AC代码:
#include<iostream>
using namespace std;
int main(){
int num;
cin>>num;
int B=num/100;//百位数字
int G=num%10;//各位数字
int S=(num/10)%10;//十位数字
for(int i=0;i<B;i++) cout<<"B";
for(int i=0;i<S;i++) cout<<"S";
for(int i=1;i<=G;i++) cout<<i;
return 0;
}
PAT-B 1007 素数对猜想
分析:用数组存储在N中的所有素数,遍历找相邻素数间差值为2
注1:因为每次总数找相邻两个的素数,即v[i+1]与v[i]差值,所以i<v.size()-1。若是i<v.size()最后i+1就得溢出
#include<iostream>
#include<vector>
using namespace std;
bool isPrime(int n){
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}
int main(){
int N,count=0;
cin>>N;
vector<int> v;//存储N中的素数
for(int i=2;i<=N;i++){
if(isPrime(i)) v.push_back(i);
}
for(int i=0;i<v.size()-1;i++){//注1
if(v[i+1]-v[i]==2) count++;
}
cout<<count<<endl;
return 0;
}
PAT-B 1008 数组元素循环右移问题
分析:题要求“不使用额外数组”,且“移动次数小”。需要想到将两个数组首尾相接在一起。例:原数组为1,2,3 相接为1,2,3,1,2,3这样从N-M+i开始连续输出N个数,就得数组元素右移M位的数组。
注1(测试点1,2):右移的位数M可能大于N 所以需要取余 即M=M%N
AC代码:
#include<iostream>
using namespace std;
int main(){
int N,M,flag=0;
cin>>N>>M;
int num[2*N];
for(int i=0;i<N;i++){
cin>>num[i];
num[i+N]=num[i];
}
M=M%N;
for(int i=0;i<N;i++){
if(flag) cout<<" ";
cout<<num[N-M+i];
flag=1;
}
return 0;
}
PAT-B 1009 说反话
分析:“有空格”,所以用getline读取一行。由于反转是单词之间的反转,不需要反转单词中的字母,所以,需要按照空格分离出每个单词,加入数组中,随后,反转数组,即可。
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int main(){
string str;
getline(cin,str);
vector<string> v;
for(int i=0;i<str.length();i++){
int j=i;
while(j<str.length()&&str[j]!=' ') j++;
v.push_back(str.substr(i,j-i));
i=j;
}
reverse(v.begin(),v.end());
int flag=0;
for(int i=0;i<v.size();i++){
if(flag) cout<<" ";
cout<<v[i];
flag=1;
}
return 0;
}
PAT-B 1010 一元多项式
#include<iostream>
using namespace std;
int main(){
int coe,index,flag=0;//分别表示系数与指数
while(cin>>coe>>index){
if(flag==0&&index==0){
cout<<"0 0";
break;
}
if(index){
if(flag) cout<<" ";
if(index!=0) cout<<coe*index<<" "<<index-1;
flag=1;
}
}
return 0;
}