信奥俱乐部C++入门常用代码手册(未完成)

编程猫信奥俱乐部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 AB)

A − B A-B AB 算法:

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
        }
    }
}
2.2.2 广度优先搜索

第四卷 提高算法

一 数论算法

二 字符串算法

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值