pat题目整理
Pat最终题目整理(菜鸟级别)
一:几个函数
①Reverse()函数; stoi将字符串类型转为int型 ;to_string关键字
头文件:#include<algorithm>;
#include usingnamespace std; intmain() { int a,b; cin>>a>>b; string c; stringresult=to_string(a*b); reverse(result.begin(),result.end()); }
②Abs函数() 输出绝对值
头文件#include<algorithm>
C=(double)abs(A-B);
③Set的insert()函数
C++ 有这样一个容器,即 STL 中的 set (可以百度一下是什么东西),set 的特性是其内所包含的元素的值唯一,利用这一特性,只要输出最终set 中元素的个数即可
头文件#include<set>
#include<set> usingnamespace std; intmain(){ set s; int n; cin>>n; for(int i=1;i<=n;i++) s.insert(i/2+i/3+i/5); cout< return 0; }
④strlen计算长度函数
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。
scanf("%s", str); int len = strlen(str);
⑤德才论中的sort函数
头文件:#include<iostream>
排序条件不够可以在sort函数末尾加上排序条件;
利用comp函数修改条件 但记住最后一定加上else return false;
判断条件:第一个true不满足条件向下继续判断;
bool comp(Stu x, Stu y) { if (x.s1 + x.s2 > y.s1 + y.s2) return true; else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true; else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true; else return false; } sort(stu1.begin(), stu1.end(), comp);
⑥pow函数
头文件#inluude<math.h>
功能:计算x的y次幂 pow(a,b)
一下三个函数以这个题为例子:
#include<iostream> #include<algorithm> #include<math.h> using namespace std; int main() { string a,b; char da,db; int m,n; int i,j,s1=0,s2=0; cin>>a>>da>>b>>db; i=count(a.begin(),a.end(),da); j=count(b.begin(),b.end(),db); m=da-'0'; n=db-'0'; for(int p=0;p<i;p++) s1+=m*pow(10,p); for(int q=0;q<j;q++) s2+=n*pow(10,q); cout<<s1+s2; return 0; }
⑦begin()和end()函数
头文件#include<string>?
string a; int sum=count(a.begin(),a.end(),tt)
⑧count()函数
头文件#include<algorithm>
输出一个数在string里出现的次数,至于这个题没定义迭代器,为喵我布吉岛。。。。
string a; int sum=count(a.begin(),a.end(),tt);
⑨swap()函数
头文件#include<iostream>//自带的???
在pat里可以用于比较三个数大小 ❤
代码如下:
#include <iostream> #include <iomanip> using namespace std; void swap(int& a,int& b) { int temp; temp = a; a =b; b =temp; } void intSort(int& num1, int& num2, int& num3, int& num4) { int temp; if (num1 <num2) { swap(num1,num2); } if (num3 <num4) { swap(num3,num4); } if (num1<num3) { swap(num1,num3); } if (num2<num4) { swap(num2,num4); } if (num2<num3) { swap(num2,num3); } } int main()//这是一个IBM在面试时的一道算法题,就是用最少的时间完成排序 {int cha; int result1,result2; int a1,b1,c1,d1; //a千位 cin>>cha; while(cha!=6174) { a1=cha/1000; b1=(cha/100)%10; c1=(cha/10)%10; d1=cha%10; intSort(a1,b1,c1,d1);
⑩setw() 和setfill() 函数
头文件:#include<iomanip>
setw()用于确定输出位数,setfill();貌似现在只有补0操作。
cout<<setw(4)<<setfill('0')<<result1<<" "<<"-"<<" "<<setw(4)<<setfill('0')<<result2<<" "<<"="<<" "<<setw(4)<<setfill('0')<<cha<<endl;//} else { cout<<setw(4)<<setfill('0')<<result1<<" "<<"-"<<" "<<setw(4)<<setfill('0')<<result2<<" "<<"="<<" "<<setw(4)<<setfill('0')<<cha<<endl;//} break; }
⑪vector容器
头文件#include<vector>
接触时间这么长了,估计不会多写了吧;
掌握几个vector函数吧 1.push_back() //插入,不多说了 2.pop_back() //pat里好像没用到过 3.insert() //没用到过,惭愧 4.find() //还是没用过 惭愧 注意下 有的pat定义vector容器是不给出容器大小会显示段错误 如: int n; cin>>n; vector<string> a(n);
⑫数组定义的初始化
写着写着就成了注意点了 那么 int a[10]; 和 int a[10]={0}; 不一样写法有事候会在pat里报错,是段错还是答案错误来着。
⑬strcpy()函数
头文件: #include<string>
c语言标准的库函数,是 str copy的缩写;
char * strcpy(char * strDest,const char * strSrc);
对此做出说明的是pat人口普查题目:
if(birth < maxAge){ //得到最年长 strcpy(max_name,name); maxAge = birth; } if(birth > minAge){ //得到最年轻 strcpy(min_name,name); minAge = birth; }
返回的是 char* 类型。
⑭map容器
头文件:#include<map>
一定记住map定义形式
map<int,string> //尖括号里的类型不能互换。
还有可以定义如同这种 map<int,vector<int>> m; 注意这是定义别出现vector名字。
map<int,vector<int>> 中可以对map进行push_back操作,如果存在a[t1] ,获取到的是map的mapped_type类型,
而vector正好可以提供所需函数。
但在map<int,int>中则不能。
⑮关于pat的输入 ps//小白专用
int k;//输入k行 1.for(int i=0;i<k;i++) {} 2.while(k--) {}
⑯STL中set<>容器
今天做了PAT1064,才发觉set<>容器好重要(哭)。
总结下吧(也不是完全版)
1.set中的插入是insert()而不是push_back() 考前提醒自己注意下, 因为set不支持有重复元素,故插入的set()容器中不存在重复的关键值。 2.set遍历 先定义迭代器 注意迭代器写法 set<int>::iterator it
set<int> a;
在进行遍历输出时
for(it=a.begin();it!=end();it++) { if(it==begin()) { cout<<*it; } else { cout<<" "<<*it; } }
再练习注意与上边三的题目相似。
⑰检查输入的合法性
关于格式输入。getchar() 有时要与getline()一同使用。
非空字符串,每个字符串以回车结束,但是字符串里面可能会有空格,所以不能直接用cin,要用getline接收一行字符。在接收完n后要getchar()读取一下换行符才能用getline,否则换行符会被读进getline中。
#include <iostream> #include<cstdio> #include<string.h> using namespace std; int main(){ int N; cin>>N; getchar(); string password; //while(N--) for(int i=0;i<N;i++) { getline(cin,password); int len=password.length(); if(len<6){ printf("Your password is tai duan le.\n");continue; } else{ int flag=1;int num=0;int letter=0;int success=0; for(int i=0;i<len;i++) { if(password[i]>='0'&&password[i]<='9')num=1; else if((password[i]>='A'&&password[i]<='Z')||(password[i]>='a'&&password[i]<='z'))letter=1; else if(password[i]!='.'){ flag=0; break; } }
if(flag==0)printf("Your password is tai luan le.\n"); else if(letter==0){printf("Your password needs zi mu.\n");flag=0;} else if(num==0){printf("Your password needs shu zi.\n");flag=0;} else if(flag==1)printf("Your password is wan mei.\n"); } } }
这个题自己写的调用外部函数弄得输出乱七八糟,还是直接写在main()里边简练。
⑩⑧有关密码的输入
有关密码的输入感觉都是用两个函数
getchar()
getline(cin,str)
再例如试密码一题。
想起来还有给定的输入 如年月日类型:1998-2-28,利用scanf输入简单,但是使用c++时要定义字符。
char c;//定义了字符类型才能输入"-" int year,month,day; cin>>year>>c>>month>>c>>day;
下边来看试密码这个题吧 嘤!
先比较下pat1067试密码和pat1081检查密码的输入要求
1067输入在第一行给出一个密码(长度不超过 20 的、不包含空格、Tab、回车的非空字符串)和一个正整数 N(≤ 10),分别是正确的密码和系统允许尝试的次数。随后每行给出一个以回车结束的非空字符串,是用户尝试输入的密码。输入保证至少有一次尝试。当读到一行只有单个 # 字符时,输入结束,并且这一行不是用户的输入。
1081本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点 .,还必须既有字母也有数字。输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。
两个题都要求是非空字符串 回车结束 然而1061要求的更明确 不包括回车 就得用getchar()函数;
但是即使要求不包括空格,还是得用getline(),不用会报错,我应该没有理解错吧┭┮﹏┭┮
#include<iostream> #include<string> using namespace std; int main() { string answer; int n; int sum=0; cin>>answer>>n; string test; getchar();//吸收回车 //cin>>test; getline(cin,test); while(test!="#") { sum++; if(test==answer) { cout<<"Welcome in"<<endl; break; } else { cout<<"Wrong password: "<<test<<endl; if(sum==n) { cout<<"Account locked"<<endl; break; } } getline(cin,test);★ } return 0; }
标★的地方要尤其注意。。。题目没给出连续输入,不能用for循环进行直接输入,需要在while循环末尾({ }内注明下一个输入)
还有在while判断条件中 while(str!=“#”)//要用双引号。
⑩⑨判断两个字符串相等
不要逐个字符来判断了。直接相等就ok了
给出例子:
string m; string n; if(m==n) { cout<<"我爱pat考试"; } else { cout<<"一定要通过考试";(不要给自己立flag啊!!!) }
当然字符串连接也有简便方法:
#include<iostream> #include<string> using namespace std; int main() { string m; string n; string mn; cin>>m>>n; mn=m+n; cout<<mn; }
结果如下:
②⑩ASCALL码
0~9 是 48~57
a~z 是 97~122
A~Z 是 65~90 大写字母与小写字母差32,用字符char类型加减32就可以。至于为啥不是差26。。表里有说明
#include<iostream> int main(){ char a; cin>>a; if(a>=65&&a<=90) cout<<"a是大写字母"; if(a>=97&&a<=122) cout<<"a是小写字母"; }
再附上更详细的大小写转化方案:https://blog.csdn.net/qian2213762498/article/details/79553372
②⑪出现次数统计
明天要考首次pat了,不会过的吧。。。毕竟自己经验还是太少了,只靠这一个月马马虎虎敲代码。。还是凉拌吧
我好像是最菜的博主了呢。如果没错的话,这应该是以后一个月最后一次pat更新了。
随之结束的是大三上学期。。。由于自己大一只是学习下计算机死知识,完全忽略编程,接着大二准备各种考证,计算机算是白瞎了吧,希望毕业前能把pat过了。(祈祷)
好了废话不多说了。看下pat1042吧。
大写字母转成小写字母: 需要加上32; 相反小写转大写相应减去32
#include <iostream> #include <string> using namespace std; int main() { int num[128]={0}; string c; getchar(); getline(cin,c); int len=c.length(); for(int i=0;i<len;i++) { if( c[i]>='a' && c[i]<='z') num[c[i]]++; else if(c[i]>='A' && c[i]<='Z') { c[i]=c[i]+32; num[c[i]]++; } } int max=0; char ch; for(int i='a';i<='z';i++) { if(num[i]>max) { max=num[i]; ch=char(i); } } cout<<ch<<" "<<max<<endl; return 0; }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------