第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;
}