蓝桥杯C++相关
Posted _WILLPOWER_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯C++相关相关的知识,希望对你有一定的参考价值。
文章目录
蓝桥杯算法
有用链接
小技巧
用变量大小初始的二维数组
#include <bits/stdc++.h>
using namespace std;
int m, n;
void Function(void *_map)
int(*map)[n] = (int(*)[n])_map; //强制转换
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cout << map[i][j] << " ";
cout << endl;
int main()
// 请在此输入您的代码
cin >> m >> n;
int(*map)[n] = (int(*)[n])malloc(sizeof(int) * m * n); // m*n的二维数组
//初始化全部为0,注意是按照字节赋值的,因此这里只有赋值0和-1才有用
memset(map, 0, sizeof(int) * m * n);
Function(map);
return 0;
求gcd最大公约数
#include <iostream>
#include <algorithm>
/*
最大公约数
*/
using namespace std;
int gcd(int a, int b)
if (a % b == 0)
return b;
else
return gcd(b, a % b);
int main()
// 请在此输入您的代码
cout << gcd(3, 4) << endl;
cout << __gcd(3, 4) << endl;
return 0;
对map for_each的遍历
void myPrint(map<int, vector<int> >::reference tmpVal)
vector<int>::iterator it;
cout<<tmpVal.first<<endl;
for(it=tmpVal.second.begin(); it!=tmpVal.second.end(); it++)
cout<<*it<<"-";
cout<<endl;
二进制输出
#include <bits/stdc++.h>
/*
任意进制转换
*/
using namespace std;
int main()
char radix_arr[1000];
//转二进制
int tmp_int = 15;
//需要转换的数, 目标装载容器, 多少进制
itoa(tmp_int, radix_arr, 2);
cout << radix_arr << endl;
初始化递增的数组或者容器
#include <bits/stdc++.h>
/*
初始化递增的数组或者容器
*/
using namespace std;
void MyPrint(int tmp_val)
cout << tmp_val << " ";
int main()
// 请在此输入您的代码
vector<int> v_tmp(26, 0); //容器
int *tmp = (int *)malloc(sizeof(int) * 26); //数组
//起始,结束,增量
iota(v_tmp.begin(), v_tmp.end(), 0);
iota(tmp, tmp + 26, 0);
for_each(v_tmp.begin(), v_tmp.end(), MyPrint);
cout << endl;
for_each(tmp, tmp + 26, MyPrint);
cout << endl;
return 0;
c++分割,按照指定字符分割
int start = 目标字符串.find('目标字符', 0);
int 分割符的数量 = stoi(目标字符串.substr(0, start));
vector<int> realys;
while (分割符的数量--)
int end = 目标字符串 .find('目标字符', start + 1);
realys.push_back(stoi(目标字符串 .substr(start + 1, end)));
start = end;
求最大最小值
#include <bits/stdc++.h>
/*
求容器或者数组中最大最小值
*/
using namespace std;
int arr[] = 1, 2, 6, 5, 3, 9, 7, 4, 5, 6, 4, 5, 6;
vector<int> v = 1, 2, 6, 5, 3, 9, 7, 4, 5, 6, 4, 5, 6;
int main()
//!最大值
//容器
vector<int>::iterator max_it = max_element(v.begin(), v.end());
cout << *max_it << endl;
//数组
int *max_p = max_element(arr, arr + (sizeof(arr) / sizeof(int)));
cout << *max_p << endl;
//!最小值
//容器
vector<int>::iterator min_it = min_element(v.begin(), v.end());
cout << *min_it << endl;
//数组
int *min_p = min_element(arr, arr + (sizeof(arr) / sizeof(int)));
cout << *min_p << endl;
return 0;
C++ vector与set互转
set<int> st(v.begin(), v.end());//在构造函数中可以直接实现vector转set
v.assign(st.begin(), st.end());//用assign实现set转vector
版权声明:本文为CSDN博主「weixin_44744335」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44744335/article/details/113882950
输出到文件
#include <fstream>
#include <stream>
using namespace std;
int main()
ofstream cout("d1.txt");
cout<<"good example"<<endl;
return 0;
小数的二进制
#include <bits/stdc++.h>
/*
小数的二级制
*/
using namespace std;
int main()
string result = "0."; //存储结果
float point, intpart;
cin >> point;
float fracpart = modf(point, &intpart); //分离小数和整数部分
while (fracpart) //小数部分不为0就一直进行下去
if (fracpart * 2 >= 1)
result += "1";
fracpart = fracpart * 2 - 1; //减去1
else
result += "0";
fracpart = fracpart * 2;
if (fracpart == 0)
cout << result << endl;
return 0;
if (result.length() > 32)
cout << result << endl;
return 0;
return 0;
位运算
-
判断奇偶
奇数末尾为1, 偶数末尾为0
待判断数 & 0x01
-
交换两个整数变量的值(不推荐)
-
异或
相同为0, 不同为1, 可以找不同, 任意数^1都会翻转
-
算有多少个1
#include <bits/stdc++.h> /* 计算有多少个1 */ using namespace std; int main() // 请在此输入您的代码 int x = 31; int cnt = 0; char bin[1000] = 0; itoa(x, bin, 2); cout << bin << endl; while (x) cnt++; x = (x - 1) & x; cout << cnt << endl; return 0;
-
奇偶交换
#include <bits/stdc++.h> /* 奇偶交换 */ using namespace std; int main() // 请在此输入您的代码 int a, b, c; a = 0b1010; // 1010 1010 保留偶数位 // 0101 0101 保留奇数位 b = a & 0b10101010; c = a & 0b01010101; cout << bitset<8>((c << 1) | (b >> 1)) << endl; return 0;
-
二个相同二进制做不进位加法为0;10个相同10进制做不进位加法为0(k个相同的k进制做不进位加法结果为0
注意事项
scanf和char
使用getchar()吸收回车非常重要
scanf("%d", &N);
char *my_char = (char *)malloc(sizeof(char)*N);
for(int j = 0; j < N; j++)
getchar(); //吸收回车
scanf("%c", &my_char[j]);
devc++中添加c++11标准
归并算法
归并排序算法完全依照了分治模式
- 分解: 将n个元素分成各含n/2个元素的子序列
- 解决:对两个子序列递归地排序;
- 合并:合并两个已排序的子序列以得到结果
和快排不同: - 归并的分解较为随意
- 重点是合并
#include <bits/stdc++.h>
/*
*/
using namespace std;
array<int, 15> arr;
void HeBing(int l, int r, int mid)
int left = l, right = mid + 1, current = l;
array<int, 15> tmpArr(arr);
while (left <= mid && right <= r)
if (arr[left] <= arr[right])
tmpArr[current++] = arr[left++];
else
tmpArr[current++] = arr[right++];
while (left <= mid)
tmpArr[current++] = arr[left++];
arr = tmpArr;
for_each(tmpArr.begin(), tmpArr.end(), [](const auto &tmp) cout << tmp << " "; );
cout << endl;
void GuiBing(int l, int r)
int mid = l + ((r - l) >> 1);
if (l < r)
GuiBing(l, mid);
GuiBing(mid + 1, r);
HeBing(l, r, mid);
int main()
iota(arr.begin(), arr.end(), 0);
random_shuffle(begin(arr), end(arr));
for_each(arr.begin(), arr.end(), [](const auto &tmp) cout << tmp << " "; );
cout << endl;
GuiBing(0, arr.size()-1);
for_each(arr.begin(), arr.end(), [](const auto &tmp) cout << tmp << " "; );
cout << endl;
return 0;
#include <bits/stdc++.h>
/*1
归并排序
先分再合并,重要在合并上面
*/
int arr[] = 1, 2, 6, 5, 3, 9, 7, 4, 5, 6, 4, 5, 6;
using namespace std;
int length;
void HeBing(int l, int r, int mid)
//复制一个辅助数组
int *help = (int *)malloc(sizeof(int) * (r-l+1));
memcpy(help, arr, (r-l+1) * sizeof(int));
int left = l;
int right = mid + 1;
int current = l;
while (left <= mid && right <= r) //!界限
if (arr[left] > arr[right])
help[current] = arr[left]蓝桥杯C++相关