題目集:pat.zju.edu.cn/contests/pat-b-practise
注:個人練習,僅供交流,歡迎指正,禁止商業用途。
B1001
#include <iostream>
using namespace std;
int mainB1001()
{
int a;
int count=0;
cin>>a;
while(1)
{
//cout<<count<<endl;
if(a==1)
break;
else
count++;
if(a%2==0)
//a=a/2;
a=a>>1;
else
{
a=(3*a+1)>>1;
//a=(3*a+1)/2;
}
}
cout<<count;
return 0;
}
B1002
#include<iostream>
#include<string>
#include<map>
#include<sstream>
using namespace std;
int mainB1002()
{
string a;
cin>>a;
int sum=0;
map<char,string> PyMap;
typedef pair<char,string> PyPair;
PyMap.insert(PyPair('0',"ling"));
PyMap.insert(PyPair('1',"yi"));
PyMap.insert(PyPair('2',"er"));
PyMap.insert(PyPair('3',"san"));
PyMap.insert(PyPair('4',"si"));
PyMap.insert(PyPair('5',"wu"));
PyMap.insert(PyPair('6',"liu"));
PyMap.insert(PyPair('7',"qi"));
PyMap.insert(PyPair('8',"ba"));
PyMap.insert(PyPair('9',"jiu"));
map<char,int> digitMap;
typedef pair<char,int> digitPair;
digitMap.insert(digitPair('0',0));
digitMap.insert(digitPair('1',1));
digitMap.insert(digitPair('2',2));
digitMap.insert(digitPair('3',3));
digitMap.insert(digitPair('4',4));
digitMap.insert(digitPair('5',5));
digitMap.insert(digitPair('6',6));
digitMap.insert(digitPair('7',7));
digitMap.insert(digitPair('8',8));
digitMap.insert(digitPair('9',9));
string::iterator sit;
for(sit=a.begin();sit!=a.end();sit++)
{
sum+=digitMap[*(sit)];
}
stringstream ss;
ss<<sum;
string ssum=ss.str();
int i=0;
for(i=0;i < ssum.length()-1;i++)
{
cout<<PyMap[ssum[i]]<<" ";
}
cout<<PyMap[ssum[i]];
return 0;
}
B1003
#include<iostream>
#include<string>
using namespace std;
int mainB1003()
{
string s;
int N;
int c1,c2,c3,flag;
bool no;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>s;
c1=0;
c2=0;
c3=0;
flag=0;
no=false;
string::iterator sit;
for(sit=s.begin();sit!=s.end();sit++)
{
if(*(sit)!='P' && *(sit)!='A' && *(sit)!='T')//"WHATEVER"
{
no=true;
break;
}
if(*(sit)=='P')
{
if(flag!=0)//"PPAT"
{
no=true;
break;
}
else
flag=1;
continue;
}
if(*(sit)=='T')
{
if(flag!=1)//"PATT"
{
no=true;
break;
}
else
flag=2;
continue;
}
if(*(sit)=='A')
{
switch(flag)
{
case 0:c1++;break;
case 1:c2++;break;
case 2:c3++;break;
default:continue;
}
}
}
if(c1*c2==c3 && c2!=0 && no!=true && flag==2)//"PT",no,"PAA"
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
B1004
//其實不用sort(),線性遍歷即可,sort()代碼少點。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
struct student
{
string name;
string sid;
int mark;
// 這是通過運算符重載來sort()
//bool operator <(const student & anostu) const
//{return mark<anostu.mark;}
};
// 這是通過比較函數來sort()
bool sortByMark(const student & a,const student & b) //no CONST at tail
{
return a.mark<b.mark;
}
int mainB1004()
{
int N;
cin>>N;
string name;
string sid;
int mark;
student stu;
vector<student> vstu;
for(int i=0;i<N;i++)
{
cin>>name>>sid>>mark;
stu.name=name;
stu.sid=sid;
stu.mark=mark;
vstu.push_back(stu);
}
// 這是通過運算符重載來sort()
//sort(vstu.begin(),vstu.end());
// 這是通過比較函數來sort()
sort(vstu.begin(),vstu.end(),sortByMark);
cout<<(*vstu.rbegin()).name<<" "<<(*vstu.rbegin()).sid<<endl;
cout<<vstu[0].name<<" "<<vstu[0].sid;
return 0;
}
B1005
#include<iostream>
#include<set>
#include<map>
using namespace std;
int mainB1005()
{
map<int,set<int>> myMap;
int N;
cin>>N;
int tmp,a;
for(int i=0;i<N;i++)
{
cin>>tmp;
a=tmp;
while(1)
{
//cout<<count<<endl;
if(a==1)
{
myMap[tmp].insert(1);
break;
}
else
myMap[tmp].insert(a);
if(a%2==0)
a=a>>1;
else
a=(3*a+1)>>1;
}
}
map<int,set<int>>::iterator iit,jit;
WHILELOOP:
for(iit=myMap.begin();iit!=myMap.end();iit++)
{
for(jit=myMap.begin();jit!=myMap.end();jit++)
{
if(((jit->second).find(iit->first))==jit->second.end() || iit==jit) // if is not contained
{
continue;
}
else
{
myMap.erase(iit);
goto WHILELOOP;//break;
}
}
}
int eleNum=myMap.size();
int count=0;
map<int,set<int>>::reverse_iterator rit;
for(rit=myMap.rbegin();rit!=myMap.rend();rit++)
{
count++;
cout<<rit->first;
if(count!=eleNum)
cout<<" ";
}
return 0;
}
B1006
#include<iostream>
using namespace std;
int mainB1006()
{
int num;
int numb,nums,numg;
cin>>num;
numb=num/100;
num%=100;
nums=num/10;
num%=10;
numg=num;
//cout<<numb<<endl<<nums<<endl<<numg<<endl;
for(int i=0;i<numb;i++)
cout<<'B';
for(int i=0;i<nums;i++)
cout<<'S';
for(int i=1;i<=numg;i++)
cout<<i;
return 0;
}
B1007
#include<stdio.h>
#include<math.h>
//more effective function.
bool isPrime(int num)
{
if (num <= 2)
{
return num == 2;
}
if (num % 2 == 0)
{
return false;
}
int iSqrt = (int)sqrt(double(num));
int i;
//it is inefficient
/*
for (i = 3; i <= iSqrt,num%i>0; i+=2)
;
*/
for (i = 3; i <= iSqrt; i+=2)
{
if(num%i==0)
break;
}
return i>iSqrt ? true : false;
}
int mainB1007()
{
//printf("%d\n",isPrime(11));
int N;
int pnum=0;
int pcount=0;
int isqrt;
int t;
int pv[100000];
scanf("%d",&N);
pv[pnum++]=2;
pv[pnum++]=3;
for(int i=4;i<=N;i++)
{
if(isPrime(i))
pv[pnum++]=i;
else
continue;
}
for(int i=0;i<pnum;i++)
{
if(pv[i]+2==pv[i+1])
pcount++;
}
printf("%d",pcount);
return 0;
}
B1008
#include<iostream>
using namespace std;
int mainB1008()
{
int N,M;
int a[100];
int tmp;
cin>>N>>M;
M%=N;//if M>=N
for(int i=0;i<N;i++)
cin>>a[i];
for(int i=0;i<M;i++)
{
tmp=a[N-1];
for(int j=N-1;j>0;j--)
{
a[j]=a[j-1];
}
a[0]=tmp;
}
for(int i=0;i<N-1;i++)
cout<<a[i]<<" ";
cout<<a[N-1];
return 0;
}
B1009
#include<iostream>
#include<string>
#include<sstream>
#include<vector>
using namespace std;
int mainB1009()
{
/*
g++下,這樣是可以的。但vc下,需要去掉部分註釋
*/
vector<string> sv;
vector<string>::reverse_iterator rit;
//string s;
string word;
//getline(cin,s);//read a string line
//stringstream ss(s);
//while(ss>>word)
while(cin>>word)//if g++
sv.push_back(word);
for(rit=sv.rbegin();rit+1!=sv.rend();rit++)//handle the last one case
cout<<*rit<<" ";
cout<<*rit;
return 0;
}
B1010
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
int mainB1010()
{
vector<int> cv;
vector<int> ev;
vector<int>::iterator cit;
vector<int>::iterator eit;
int c,e;
string s;
getline(cin,s);
stringstream ss(s);
while(ss>>c>>e)
{
cv.push_back(c);
ev.push_back(e);
}
if(cv.size()==1)
{
cout<<cv[0]*ev[0]<<" "<<(ev[0]==0?0:ev[0]-1);
return 0;
}
for(cit=cv.begin(),eit=ev.begin();cit+2!=cv.end(),eit+2!=ev.end();cit++,eit++)
{
cout<<(*cit)*(*eit)<<" "<<*eit-1<<" ";
}
cout<<(*cit)*(*eit)<<" "<<*eit-1;
if(*(eit+1)!=0)
{
cit++;eit++;
cout<<" "<<(*cit)*(*eit)<<" "<<*eit-1;
}
return 0;
}