编程猫信奥俱乐部C++入门常用代码手册
目录
第一卷 基础语法
第一章 顺序结构
1.1 定义变量
int a = 10; // 定义整型变量a并赋值为10
double b = 3.14; // 定义浮点型变量b并赋值为3.14
char c = 'A'; // 定义字符型变量c并赋值为'A'
bool d = true; // 定义布尔型变量d并赋值为true
1.2 输出变量
cout << "a = " << a << endl; // 输出整型变量a的值
cout << "b = " << b << endl; // 输出浮点型变量b的值
cout << "c = " << c << endl; // 输出字符型变量c的值
cout << "d = " << d << endl; // 输出布尔型变量d的值
1.3 运算符
int e = 5 + 3; // 加法运算
int f = 5 - 3; // 减法运算
int g = 5 * 3; // 乘法运算
int h = 5 / 3; // 除法运算
int i = 5 % 3; // 取余运算
int j = 5 > 3; // 大于运算
int k = 5 < 3; // 小于运算
int l = 5 == 3; // 等于运算
int m = 5 != 3; // 不等于运算
第二章 分支结构
2.1 条件语句
判断 a a a 和 b b b 的大小
cin>>a>>b; // 输入a和b的值
if (a > b) { // 如果a大于b
cout << "a is greater than b" << endl;
} else if (a < b) { // 如果a小于b
cout << "a is less than b" << endl;
} else { // 如果a等于b
cout << "a is equal to b" << endl;
}
2.2 逻辑运算
判断 y y y 年是否是闰年
cin>>y; // 输入年份y
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { // 判断是否是闰年
cout << y << "Yes" << endl; // 输出结果
} else {
cout << y << "No" << endl; // 输出结果
}
判断 a , b , c a,b,c a,b,c 是否构成三角形
cin>>a>>b>>c; // 输入a,b,c的值
if (a + b > c && a + c > b && b + c > a) { // 判断是否构成三角形
cout << "Yes" << endl; // 输出结果
}
else {
cout << "No" << endl; // 输出结果
}
范围判断:判断 n n n 是否在80-90之间
cin>>n; // 输入数值n
if (n >= 80 && n <= 90) { // 判断是否在80-90之间
cout << "Yes" << endl; // 输出结果
}
else {
cout << "No" << endl; // 输出结果
}
字符判断:判断大写字母 c h ch ch 是否在’A’和’Z’之间
char ch; // 定义字符型变量ch
cin >> ch; // 输入字符
if (ch >= 'A' && ch <= 'Z') { // 判断是否在'A'和'Z'之间
cout << "Yes" << endl; // 输出结果
}
else {
cout << "No" << endl; // 输出结果
}
字符判断:判断 c h ch ch 是否是字母
char ch; // 定义字符型变量ch
cin >> ch; // 输入字符
if (ch >= 'A' && ch <= 'Z') { // 判断是否是大写字母
cout << "Yes" << endl; // 输出结果
}
else if (ch >= 'a' && ch <= 'z') { // 判断是否是小写字母
cout << "Yes" << endl; // 输出结果
}
else {
cout << "No" << endl; // 输出结果
}
字符判断:判断 c h ch ch 是否是数字字符
char ch; // 定义字符型变量ch
cin >> ch; // 输入字符
if (ch >= '0' && ch <= '9') { // 判断是否是数字
cout << "Yes" << endl; // 输出结果
}
else {
cout << "No" << endl; // 输出结果
}
第三章 循环结构
3.1 while循环语句
for (int i = 0; i < 5; i++) { // 循环5次
cout << "i = " << i << endl;
}
cin>>n; // 输入数值n
while (n > 0) { // 循环直到n等于0
cout << "n = " << n << endl;
n--;
}
3.2 do-while循环语句
int m = 0; // 定义整型变量m并赋值为0
do { // 循环直到m等于5
cout << "m = " << m << endl;
m++;
} while (m < 5);
3.3 for循环语句
for (int j = 0; j < 5; j++) { // 循环5次
cout << "j = " << j << endl;
}
3.4 循环嵌套
for (int i = 0; i < 3; i++) { // 外层循环3次
for (int j = 0; j < 2; j++) { // 内层循环2次
cout << "i = " << i << " j = " << j << endl;
}
}
3.5 循环的应用
求1到100的和
int sum = 0; // 定义变量sum并赋值为0
for (int i = 1; i <= 100; i++) { // 循环1到100
sum += i; // 累加i
}
cout << "1 + 2 + ... + 100 = " << sum << endl; // 输出结果
求1到100的积
int product = 1; // 定义变量product并赋值为1
for (int i = 1; i <= 100; i++) { // 循环1到100
product *= i; // 累乘i
}
cout << "1 * 2 * ... * 100 = " << product << endl; // 输出结果
第四章 数组
4.1 定义数组
int arr[5]; // 定义整型数组arr,元素个数为5
double arr2[3] = {1.2, 3.4, 5.6}; // 定义浮点型数组arr2,元素个数为3,并初始化元素值
char arr3[2] = {'A', 'B'}; // 定义字符型数组arr3,元素个数为2,并初始化元素值
bool arr4[2] = {true, false}; // 定义布尔型数组arr4,元素个数为2,并初始化元素值
const int N=1E+10; // 定义常量N
int arr[N]; // 定义整型数组arr,元素个数为N
4.2 访问数组元素
arr[0] = 10; // 给arr的第一个元素赋值为10
arr2[1] = 3.14; // 给arr2的第二个元素赋值为3.14
arr3[0] = 'C'; // 给arr3的第一个元素赋值为'C'
arr4[1] = false; // 给arr4的第二个元素赋值为false
4.3 遍历数组元素
// 输入数组arr的n个元素
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i]; // 输入arr[i]的值
}
// 输出数组arr的n个元素
for(int i=1;i<=n;i++){
cout<<arr[i]<<" "; // 输出arr[i]的值
}
// 逆序输出数组arr的n个元素
for(int i=n;i>=1;i--){
cout<<arr[i]<<" "; // 输出arr[i]的值
}
4.4 数组中元素最值
// 输入数组arr的n个元素
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i]; // 输入arr[i]的值
}
// 输出数组arr的最小值
int mn=arr[1];
for(int i=2;i<=n;i++){
if(arr[i]<mn) mn=arr[i]; // 更新最小值
}
cout<<"min="<<mn<<endl;
4.5 桶计数
// 桶计数
const int N=1E+5; // 定义常量N
int cnt[N+1]; // 定义计数数组cnt,元素个数为N+1
for(int i=1;i<=n;i++){
cnt[arr[i]]++; // 计数数组cnt的第arr[i]个元素加1
}
for(int i=1;i<=N;i++){
cout<<cnt[i]<<" "; // 输出计数数组cnt的第i个元素
}
4.6 字符数组
// 字符数组的定义
char str[100]; // 定义字符型数组str,元素个数为100
// 字符数组的输入
cin>>str; // 输入字符数组str(无空格字符串)
getline(cin,str); // 输入字符数组str,直到遇到换行符
// 字符数组的输出
cout<<str<<endl; // 输出字符数组str
4.7 字符串
// 字符串的定义
string str; // 定义字符串str
// 字符串的输入
cin>>str; // 输入字符串str
getline(cin,str); // 输入字符串str,直到遇到换行符
// 字符串的输出
cout<<str<<endl; // 输出字符串str
// 字符串的长度
int len=str.length(); // 计算字符串str的长度
// 字符串的比较
if(str1<str2) cout<<"str1 is less than str2"<<endl;
else if(str1>str2) cout<<"str1 is greater than str2"<<endl;
else cout<<"str1 is equal to str2"<<endl;
// 字符串的拼接
string str3=str1+str2; // 字符串str1和str2拼接
// 字符串的切割
string str4=str.substr(i,j); // 字符串str的子串,从i开始,长度为j
// 字符串的查找
int pos=str.find(sub); // 查找子串sub在字符串str中的位置,不存在则返回string::npos
// 字符串的替换
string str5=str.replace(i,j,sub); // 字符串str的子串,从i开始,长度为j,替换为sub
// 字符串的排序
sort(str.begin(),str.end()); // 字符串str的排序
// 字符串的反转
reverse(str.begin(),str.end()); // 字符串str的反转
// 判断字符串中大写字母的数量
int cnt=0;
for(int i=0;i<str.size();i++){
if(str[i]>='A' && str[i]<='Z') cnt++;
}
// 判断字符串是否是回文串
cin>>s1; // 输入字符串s1
s2=s1; // 复制字符串s1
reverse(s2.begin(),s2.end()); // 反转字符串s2
if(s1==s2){
cout<<"Yes"<<endl; // 输出结果
}
else{
cout<<"No"<<endl; // 输出结果
}
// 统计字符串中单词word的数量
int cnt=0;
int pos=str.find(word); // 查找word的位置
while(pos!=string::npos){
cnt++;
pos=str.find(word,pos+1); // 查找下一个word的位置
}
第五章 函数
// 定义函数
void func(int a,int b){
cout<<a+b<<endl;
}
// 调用函数
func(1,2); // 输出3
// 定义判断质数的函数
bool isPrime(int n){
if(n<=1) return false; // 1不是质数
for(int i=2;i*i<=n;i++){ // 遍历2到sqrt(n)
if(n%i==0) return false; // 如果n有因子,则不是质数
}
return true; // 如果没有因子,则是质数
}
// 调用函数
int n;
cin>>n;
if(isPrime(n)) cout<<"Yes"<<endl; // 输出结果
else cout<<"No"<<endl; // 输出结果
// 定义求最大公约数的函数
int gcd(int a,int b){
if(b==0) return a; // 如果b为0,则最大公约数为a
return gcd(b,a%b); // 否则最大公约数为gcd(b,a%b)
}
// 调用函数
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl; // 输出最大公约数
// 定义求最小公倍数的函数
int lcm(int a,int b){
return a*b/gcd(a,b); // 最小公倍数为a*b/gcd(a,b)
}
// 调用函数
int a,b;
cin>>a>>b;
cout<<lcm(a,b)<<endl; // 输出最小公倍数
// 定义求阶乘的函数
int fac(int n){
if(n==0) return 1; // 0的阶乘为1
long long result=1; // 定义长整型变量result
for(int i=1;i<=n;i++){
result*=i; // result乘以i
}
return result; // 返回result
}
// 调用函数
int n;
cin>>n;
cout<<fac(n)<<endl; // 输出n的阶乘
第六章 结构体
6.1 定义结构体
struct node{
double x,y; // 定义结构体Point的两个成员变量x和y
};
6.2 创建结构体变量
node p1; // 定义结构体变量p1
p1.x=1.2; // 给p1的x成员变量赋值为1.2
p1.y=3.4; // 给p1的y成员变量赋值为3.4
6.3 创建结构体数组
const int N=1E+5; // 定义常量N
node arr[N]; // 定义结构体数组arr,元素个数为N
6.4 遍历结构体数组
// 输入结构体数组arr的n个元素
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i].x>>arr[i].y; // 输入arr[i]的x和y成员变量的值
}
// 输出结构体数组arr的n个元素
for(int i=1;i<=n;i++){
cout<<arr[i].x<<" "<<arr[i].y<<endl; // 输出arr[i]的x和y成员变量的值
}
6.5 结构体数组的排序
bool cmp(node a,node b){ // 自定义结构体比较函数
if(a.x<b.x) return true; // 如果a的x值小于b的x值,则返回true
else if(a.x>b.x) return false; // 如果a的x值大于b的x值,则返回false
else return a.y<b.y; // 如果a的x值等于b的x值,则比较a的y值
}
// 输入结构体数组arr的n个元素
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i].x>>arr[i].y; // 输入arr[i]的x和y成员变量的值
}
// 结构体数组排序
sort(arr+1,arr+n+1,cmp); // 排序函数
第二卷 基础算法
一 高精度算法
1.1 高精度的存储
// 定义高精度整数数组A
int A[5010],la=1; // 定义变量la,用于记录A数组的长度
string s1; // 定义字符串s1
// 输入高精度整数A
cin>>s1; // 输入字符串s1
for(int i=s1.size()-1;i>=0;i--){
A[la++]=s1[i]-'0'; // 逆序将字符串n的每一位转换为整数并存入A数组
}
1.2 高精度的比较
// 高精度整数A和B的比较
int A[5010],B[5010],la=1,lb=1; // 定义变量la和lb,用于记录A和B数组的长度
string s1,s2; // 定义字符串s1和s2
cin>>s1>>s2; // 输入字符串s1和s2
for(int i=s1.size()-1;i>=0;i--){
A[la++]=s1[i]-'0'; // 逆序将字符串s1的每一位转换为整数并存入A数组
}
for(int i=s2.size()-1;i>=0;i--){
B[lb++]=s2[i]-'0'; // 逆序将字符串s2的每一位转换为整数并存入B数组
}
if(la>lb) cout<<"A is greater than B"<<endl;
else if(la<lb) cout<<"A is less than B"<<endl;
else{ // 如果la=lb
for(int i=la;i>=1;i--){
if(A[i]>B[i]) cout<<"A is greater than B"<<endl;
else if(A[i]<B[i]) cout<<"A is less than B"<<endl;
else continue; // 如果A[i]=B[i],则比较下一位
}
cout<<"A is equal to B"<<endl;
}
1.3 加法( A + B A+B A+B)
A + B A+B A+B 算法:
int A[5010],B[5010],C[5010]; // 定义高精度整数A[5010]和B[5010]
int lc=la; // 定义变量len,用于记录C数组的长度
// 计算C数组的长度
lc = max(la,lb)+1; // 假设C数组的长度为la
// 计算C数组的第i位
for(int i=1;i<=lc;i++){
C[i]+=A[i]+B[i]; // 初始化C数组
C[i+1]+=C[i]/10;
C[i]%=10;
}
// 去掉多余的0
while(lc>1 && C[lc]==0) lc--;
// 输出C数组
for(int i=lc;i>=1;i--){
cout<<C[i];
}
cout << endl;
1.4 减法( A − B A-B A−B)
A − B A-B A−B 算法:
int A[5010],B[5010],C[5010]; // 定义高精度整数A[5010]和B[5010]
int lc=la; // 定义变量len,用于记录C数组的长度
// 计算C数组的长度
lc = la; // 假设C数组的长度为la
// 计算C数组的第i位
for(int i=1;i<=lc;i++){
C[i]+=A[i]-B[i]; // 初始化C数组
if(C[i]<0){ // 处理溢出
C[i]+=10;
C[i+1]-=1;
}
}
// 去掉多余的0
while(lc>1 && C[lc]==0) lc--;
// 输出C数组
for(int i=lc;i>=1;i--){
cout<<C[i];
}
cout << endl;
1.5 乘法
A × b A \times b A×b (高精度整数 A A A 乘以非高精度整数 b b b)算法:
int A[5010],b,C[5010]; // 定义高精度整数A[5010]和非高精度整数b
int lc=la; // 定义变量len,用于记录C数组的长度
// 计算C数组的长度
lc = la+12; // 假设C数组的长度为la+12
// 计算C数组的第i位
for(int i=1;i<=lc;i++){
C[i]+=A[i]*b; // 初始化C数组
C[i+1]+=C[i]/10; // 进位
C[i]%=10; // 取余
}
// 去掉多余的0
while(lc>1 && C[lc]==0) lc--;
// 输出C数组
for(int i=lc;i>=1;i--){
cout<<C[i];
}
cout << endl;
A × B A \times B A×B (高精度整数 A A A 乘以高精度整数 B B B)算法:
int A[5010],B[5010],C[5010]; // 定义高精度整数A[5010]和B[5010]
int lc=la+lb; // 定义变量len,用于记录C数组的长度
// 计算C数组的长度
lc = la+lb; // 假设C数组的长度为la+lb-1
// 计算C数组的第i位
for(int i=1; i<=la; i++){
for (int j=1; j<=lb; j++) {
C[i+j-1]+=A[i]*B[j]; // 初始化C数组
C[i+j]+=C[i+j-1]/10; // 进位
C[i+j-1]%=10; // 取余
}
}
// 去掉多余的0
while(lc>1 && C[lc]==0) lc--;
// 输出C数组
for(int i=lc;i>=1;i--){
cout<<C[i];
}
cout << endl;
1.6 除法( A ÷ b A \div b A÷b)
高精度整数 A A A 除以非高精度整数 b b b 的算法:
int A[5010],b,C[5010]; // 定义高精度整数A[5010]和非高精度整数b
int lc=la; // 定义变量len,用于记录C数组的长度
// 计算C数组的长度
lc = la; // 假设C数组的长度为la
// 计算C数组的第i位
for(int i=lc;i<=lc;i++){
C[i]+=A[i]/b; // 计算商
A[i]%=b; // 计算余数
}
// 去掉多余的0
while(lc>1 && C[lc]==0) lc--;
// 输出C数组
for(int i=lc;i>=1;i--){
cout<<C[i];
}
cout << endl;
二 排序算法
三 分治算法
四 贪心算法
五 搜索与回溯算法
// n个数取m个的组合问题
const int N=100; // 定义常量N
int a[N]; // 定义数组a
int cnt=0; // 定义变量cnt,用于记录组合数
void dfs(int i,int k){ // 定义函数dfs,求解n个数取m个的组合问题
if(k==m){ // 所有数都取完
cnt++; // 组合数+1
return;
}
if(i==n+1){ // 所有数都已经取完
return;
}
dfs(i+1,k); // 不取第i个数
if(k+a[i]<=m){ // 如果第i个数可以取
dfs(i+1,k+a[i]); // 取第i个数
}
}
dfs(0,0); // 调用函数dfs,求解n个数取m个的组合问题
// n个数取m个数的排列问题
const int N=100; // 定义常量N
int a[N]; // 定义数组a
int cnt=0; // 定义变量cnt,用于记录排列数
void dfs(int i,int k){ // 定义函数dfs,求解n个数取m个数的排列问题
if(k==m){ // 所有数都取完
cnt++; // 排列数+1
return;
}
if(i==n+1){ // 所有数都已经取完
return;
}
for(int j=i;j<=n;j++){ // 枚举第i个数的位置
swap(a[i],a[j]); // 交换第i个数和第j个数
dfs(i+1,k+1); // 取第i个数
swap(a[i],a[j]); // 撤销交换
}
}
dfs(0,0); // 调用函数dfs,求解n个数取m个数的排列问题
六 动态规划算法
6.1 线性动态规划
6.2 背包问题
6.3 二维数组动态规划
6.4 区间动态规划
6.5 数位动态规划
第三卷 图论算法
一、树与二叉树
二、图
2.1 图的存储
// 使用邻接矩阵存储图
const int N=1E+5; // 定义常量N
int g[N][N];
int n,m;
cin>>n>>m; // 输入n和m
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w; // 输入边(u,v)的权值w
g[u][v]=w; // 边(u,v)加入
g[v][u]=w; // 无向图,边(v,u)也加入
}
// 使用邻接表存储图
const int N=1E+5; // 定义常量N
struct Edge{
int v,w;
Edge(int _v,int _w):v(_v),w(_w){};
};
vector<Edge> e[N];
int n,m;
cin>>n>>m; // 输入n和m
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w; // 输入边(u,v)的权值w
e[u].push_back(Edge(v,w)); // 边(u,v)加入u的邻接表
e[v].push_back(Edge(u,w)); // (无向图)边(v,u)加入v的邻接表
}
2.2 图的遍历
2.2.1 深度优先搜索
void dfs(int u,int vis[]){
vis[u]=true; // 标记u为已访问
cout<<u<<" "; // 输出u
for(int i=0;i<n;i++){ // 遍历所有顶点
if(!vis[i] && g[u][i]){ // 如果i未访问且有边(u,i)
dfs(i,vis); // 递归访问i
}
}
}
void dfs(int u,int vis[]){
vis[u]=true; // 标记u为已访问
cout<<u<<" "; // 输出u
for(int i=0;i<e[u].size();i++){ // 遍历u的邻接表
int v=e[u][i].v;
if(!vis[v]){ // 如果v未访问
dfs(v,vis); // 递归访问v
}
}
}