判断素数

HDU1059
求一个数字的质因子之积时,只需要考虑小于等于根号n的质因子,但是最后剩下的可能还是个质数,所以要格外考虑下

bool isPrime(int x){if(x<=1)return false;for(int i=2; i<=int(sqrt(x*1.0)); i++){if(x % i == 0)return false;}return true;
}

最大公约数gcd 辗转相除法

int gcd(long long a, long long b){return b == 0 ? abs(a) : gcd(b, a%b);
}

最小公倍数

int lcm(int a, int b) {return a * b / gcd(a, b);
}

四则运算

https://pintia.cn/problem-sets/994805342720868352/problems/994805378443755520

//定义分子分母
struct fraction{ll up, down;
}a, b;//gcd最简化
fraction reduction(fraction res){if(res.down<0){  //保证分母是正数res.up = -res.up;res.down = -res.down;}if(res.up == 0)res.down = 1;else{int t = gcd(abs(res.up), abs(res.down));res.up /= t;res.down /= t;}return res;
}
//分数加法
fraction add(fraction f1, fraction f2){fraction res;res.up = f1.up * f2.down + f2.up * f1.down;res.down = f1.down * f2.down;return reduction(res);
}
//输出形式
void showResult(fraction res){res = reduction(res);if(res.up<0)cout << "(";if(res.down == 1)cout << res.up;else if(abs(res.up) > res.down)cout << res.up/res.down << " " << abs(res.up)%res.down << "/" << res.down;elsecout << res.up << "/" << res.down;if(res.up<0)cout << ")";
}

将n按照d进制逆序

while(n){sum = sum * d + n % d;n = n / d;
}

结构体的定义

struct record{char name[25];int month, dd, hh, mm;bool status;
}rec[maxn], temp;

排序cmp

bool cmp(record a, record b){int s = strcmp(a.name, b.name);if(s != 0)return s < 0; //优先按照姓名字典序从小到大排序else if(a.month != b.month) //按照月份排序return a.month < b.month;else if(a.dd != b.dd)return a.dd < b.dd;else if(a.hh != b.hh)return a.hh < b.hh;elsereturn a.mm < b.mm;
}//比较字符串或者是char数组时,用strcmp
return strcmp(a.id,b.id)<0;//使用方法
sort(rec, rec+N, cmp);

枚举2^n种情况(熄灯问题)

直到guess()==flase退出枚举

while(guess()){press[1][1]++;int k=1;while(press[1][k] > 1){press[1][k] = 0;k++;press[1][k]++;}
}

大整数加法

string add(string s1,string s2)  // 加
{int i,j,k,t;string sum;t=0;k=0;if(s2.size()>s1.size()){s1.swap(s2);k=1; //标记是否s1,s2交换;保证s2长度不大于s1}for(i=0;i<s2.size();i++){sum+=(s1[s1.size()-1-i]-'0'+s2[s2.size()-1-i]-'0'+t)%10+'0';  //从末位开始逐位做加法,t表示是否进位if((s1[s1.size()-1-i]-'0'+s2[s2.size()-1-i]-'0'+t)>=10)t=1;else t=0;}if(s1.size()==s2.size() && t==1)sum+='1';else{for(j=s1.size()-1-i;j>=0;j--){sum+=(s1[j]-'0'+t)%10+'0';if(s1[j]-'0'+t>=10)t=1;else t=0;}if(t==1)sum+='1';}reverse(sum.begin(),sum.end());return sum;
}

大整数减法

string sub(string s1,string s2)   // 减
{int flag=0,i;if(s1.size()<=s2.size()){if(s2.size()>s1.size())flag=1;else{for(i=0;i<s1.size();i++){if(s1[i]>s2[i])break;else if(s1[i]<s2[i]){flag=1;break;}}}}//保证s2小于等于s1if(flag==1)s1.swap(s2);string ans;reverse(s1.begin(),s1.end());reverse(s2.begin(),s2.end());for(i=0;i<s1.size();i++){if(i>=s2.size())s2+='0';ans+=s1[i]-s2[i]+'0';if(s1[i]<s2[i]){ans[i]+=10;s1[i+1]-=1;}}reverse(ans.begin(),ans.end());for(i=0;i<ans.size();i++){if(*ans.begin()=='0')ans.erase(ans.begin());else break;}if(flag==1)ans.insert(0,"-");return ans.size()==0?"0":ans;
}

大整数乘法

string mul(string s1,string s2)    // 乘
{int i,j,t;vector<int> num1,num2,ans;string s;//倒过来放算的时候比较方便for(i=s1.size()-1;i>=0;i--){num1.push_back(s1[i]-'0');}for(i=s2.size()-1;i>=0;i--){num2.push_back(s2[i]-'0');}//按照平常的计算方式计算for(i=0;i<num2.size();i++)for(j=0;j<num1.size();j++){if(i+j>=ans.size())ans.push_back(num1[j]*num2[i]);else ans[i+j]+=num1[j]*num2[i];}//解决进位问题t=0;for(i=0;i<ans.size();i++){ans[i]+=t;t=ans[i]/10;ans[i]%=10;}if(t!=0)ans.push_back(t);reverse(ans.begin(),ans.end());for(i=0;i<ans.size();i++)s+=ans[i]+'0';return s;
}

将字符串转化为double,整数转为字符串

string n;
double x = atof(n.c_str())//整数转为字符串
int n;
string m = to_string(n);

读入未知长度以空格区分的一行数据

//例如 * + 11.0 12.0 + 24.0 35.0
string temp;
while(cin >> temp){n[index++] = temp;char ch = getchar();//通过getchar()来判断最后输入回车符结束if(ch == '\n')break;
}

优先队列

队首元素一定是当前队列中优先级最高的那一个

priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
priority_queue<double, vector<double>, greater<double> > q;
//默认最大的最优先,通过改变greater实现数字越小,优先级越高

中缀转为后缀表达式(含!)

string s;
vector<char> sta;
stack<char> temp;
getline(cin, s);
sta.clear();
for(int i=0; i< s.size(); i++){if(s[i] == ' ')continue;if(s[i] == 'V' || s[i] == 'F')sta.push_back(s[i]);else{if(s[i] == '('){temp.push(s[i]);}else if(s[i] == ')'){char x = temp.top();sta.push_back(x);temp.pop();temp.pop();}else if(s[i] == '!'){temp.push(s[i]);}else if(s[i] == '|' || s[i] == '&'){if(temp.empty())temp.push(s[i]);else{while(temp.top() == '|' || temp.top() == '&' || temp.top() == '!'){sta.push_back(temp.top());temp.pop();if(temp.empty())break;}temp.push(s[i]);}}}
}
for(int i=0; i<temp.size(); i++){sta.push_back(temp.top());temp.pop();
}

KMP

用string存储有时会超时,可用char[]数组代替

//将字符串输入到s中,并且增加s[0]=k,输入从s[1]开始
char s[100];
scanf("%s", s+1);s[0] = 'k';
//求输入到数组中的字符串长度
int len = strlen(s);
//nextval
void cal_nextval(string t){int i=1, j=0;nextval[1] = 0;while(i <= t.length()){if(j == 0 || t[i] == t[j]){i++;j++;if(t[i] != t[j])nextval[i] = j;elsenextval[i] = nextval[j];} elsej = nextval[j];}
}//KMPint kmp(string s, string t){cal_nextval(t);int i=1, j=1;int c = 0;while(i <= s.length() && j <= t.length()){if(j==0 || s[i] == t[j]){i++;j++;} elsej = nextval[j];if(j>t.length()){c++;j=nextval[j];}}return c;
}

kmp next 变形

char s[1005];
char t[1005];
int nextval[1005] = {0};void get_next(int len_t){int i=0, j=-1;nextval[0] = -1;while(i < len_t){if(j == -1 || t[i]==t[j]){i++;j++;nextval[i] = j;} elsej = nextval[j];}
}int kmp(int len_s, int len_t){get_next(len_t);int count=0;int i=0, j=0;while(i < len_s){if(j==-1 || s[i] == t[j]){i++;j++;}elsej=nextval[j];if(j>=len_t){j=0;count++;}}return count;
}int main(){while(cin >> s){if(s[0] == '#' && strlen(s) == 1)break;cin >> t;int len_s = strlen(s);int len_t = strlen(t);cout << kmp(len_s, len_t) << endl;}
}

map的使用

map的遍历顺序与输入顺序是不一致的,内部是红黑树机制

map<string, string> m;
m[b] = a; //赋值或者取值
//map初始化
map<int, string>m = {{0,"ling"}, {1,"yi"}}
//迭代
map<string, string>::iterator iter;
for(iter=m.begin(); iter != m.end(); iter++)cout << iter->first << " " << iter->second << endl;//迭代法二
for(auto & it : mp){nod temp;temp.cardnum = it.first;temp.nt = it.second;v2.push_back(temp);
}

list的使用

list<int> lit[10005];
//插入
lit[id1].push_back(id2);
//合并两个list
lit[id1].merge(lit[id2]);
//去重,unique只能去重相邻元素
lit[id1].unique();
//list不能按下标取值,只能用迭代器
list<int>::iterator it;
int i=0;
for(it=lit[id1].begin();it!=lit[id1].end();++it)cout << *it << endl;

前序和中序构造二叉链表

struct node{int data;node *lc, *rc;
}*N;node * PreInCreate(int prei, int prej, int ini, int inj){node *root = new node;root->data = pre[prei];
//    cout << root->data << " ";int i;for(i=ini; in[i]!=root->data; i++);int llen = i-ini;int rlen = inj-i;if(llen)root->lc = PreInCreate(prei+1, prei+llen, ini, i-1);elseroot->lc = NULL;if(rlen)root->rc = PreInCreate(prej+i-inj+1, prej, i+1, inj);elseroot->rc = NULL;return root;
}node *TT = new node;
TT = PreInCreate(1, k, 1, k);

数组置为inf

#define inf 0x3f3f3f
//int e[1000][1000], dis[1000];
fill(e[0], e[0] + 510 * 510, inf);
fill(dis, dis + 510, inf);
memset(dis, 0, sizeof(dis));

大整数正反相加

如s=1234567
即求 1234567+7654321

Cin Cout 超时

一、使用scanf, printf代替

char name[10];
scanf("%s", name);
//可以直接strcmp(name, "xxxx")==0判断

实在是要用string
!!!

node.name.resize(10);
scanf("%s", &node.name[0]);//这样输入会自动在不足resize的位置以“\0”填充,所以不能直接跟给定的“xxx”进行==比较
printf("%s", node.name.c_str());
//加上.c_str()之后,会把后面的"\0"去掉

!!!
char[]数组和string比较字符串时有区别
char[]
return (strcmp(a.name, b.name) < 0);
string
return a.name < b.name;

vector初始化

vector<int>v(n);
//这样就可以直接给v[i]赋值,如果不初始化(不加(n))只能push_back

关于string
可以用s.substr(1,3)代表子串,从1开始的3位

二、直接cin >> node[i].ch,也可能会超时,先cin到临时变量,再存到node里面去

三、map<string, vector > stu;

C++常用函数(刷PAT甲级总结)相关推荐

  1. 刷PAT甲级的各题思路、细节以及遇到的问题记录

    1001 A+B Format (20分) 因为一定会用到字符串,而string非常好用,但是用的时候一定要注意不能越界访问,否则会在运行时出现abort() has been called. 100 ...

  2. 【PAT】PAT甲级题库所有题解(持续更新中...)

    题解: 本文为导航页,一些希望刷PAT甲级的玩家可以来看看,我会持续更新所有题目的题解(取决于我做到哪儿了(doge)) 题号按照PAT官网给出的标注 题目: 链接 标签 1001 A+B Forma ...

  3. PAT乙级刷题心得和常用函数总结 (c++实现)

    开始先说最重要心得体会: 写代码前,先在纸上写写画画,写下伪码,理清思路,别上来就敲代码,效率极低还易出现bug. 2019-12-12到2020-01-17,用C++刷完了PAT乙级95道题目,第6 ...

  4. 2020年9月PAT甲级满分必备刷题技巧

    2020年7月的考试结束了,除了本次的考题更新,短期内不会更新. [7月题目的特点:首次线上考试,没出链表.树相关的模板题,第2到4题背景新颖,大大降低了抄袭历年代码的可能性,可以看作是线上考试的新趋 ...

  5. PAT甲级1141 PAT Ranking of Institutions :[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数、排名

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析:和下面这题是一道题: PAT甲级1137 Final Grading:[C++题解]结构体.排序.哈希表.结构体构造函数.结构体内写函 ...

  6. PAT甲级1137 Final Grading:[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数

    文章目录 题目分析 题目链接 题目分析 分析: 首先一个学生有id,另外有4个成绩:编程成绩.期中成绩.期末成绩.总评成绩.现有3个成绩单:编程成绩.期中成绩.期末成绩,让计算总评成绩,并排序输出. ...

  7. PAT甲级刷题记录-(AcWing)-(Day06树 8题)

    PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...

  8. 小峰峰的pat甲级刷题记录1020

    小峰峰的pat甲级刷题记录1020 方法一:通过后序和中序序列构建树,再层序输出 #include<iostream> #include<vector> using names ...

  9. PAT甲级 1014 刷题记录

    文章目录 一.答案 (一)推荐答案 (二)个人解答 二.坑点 三.相关知识 (一)vector 与queue 两种结构的使用方法 (二)其他 一.答案 (一)推荐答案 链接:PAT甲级1014 测试点 ...

最新文章

  1. eclipse中的git安装与使用
  2. 6_分布式训练框架Horovod使用(20190111)
  3. 学习“用dlopen,dlsym加载动态链接库.so中函数”之摘录
  4. MFC原理 消息传递
  5. 500多页的机器学习入门笔记,下载超5万次,都讲了些什么?
  6. [机器学习-原理及实现篇]线性回归-最小二乘法
  7. Strategy 定义一系列算法或策略,把它们封闭起来,并且使它们相互可以替换。各算法或策略可以独立于客户程序而变化。...
  8. ArcGIS API For JavaScript——空间查询(QueryTask)
  9. Halcon对文件的创建、读取、写入、删除等操作
  10. PDFObject的使用(转)
  11. 计算机文化基础说课ppt,计算机文化基础说课 -_图文.ppt
  12. 中医药天池大数据竞赛——中医文献问题生成挑战(二)
  13. VMware虚拟机启动失败:“DevicePowerOn”
  14. 基于51单片机的数字气压计
  15. <Zhuuu_ZZ>设计模式—面向接口编程
  16. Paper:LIME之《Why Should I Trust You? Explaining the Predictions of Any Classifier为什么要相信你?解释任何分类器的预测》翻
  17. 锐捷NBR路由器 EWEB网管系统 远程命令执行漏洞 + GetShell
  18. 如何创建全球(全局)公司代码 (Global Company Code )
  19. 在Windows下开发调试PySpark
  20. 51单片机(8051系列)外部时钟

热门文章

  1. RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放
  2. 备战2022春招-java-day7
  3. 怎么提取音乐中的伴奏?分享一个超好用的方法
  4. 2020-08-29 ---- 美团点评 笔试
  5. html页分割线最简单的实现方式
  6. 电脑(伪)大神装B必备,来学几个windows脚本命令
  7. C#控制键盘按键的常用方法
  8. android如何屏蔽掉home键
  9. c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...
  10. JavaScript实战操作(DOM,BOM)