蓝桥杯C++相关

Posted _WILLPOWER_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯C++相关相关的知识,希望对你有一定的参考价值。

文章目录

蓝桥杯算法

有用链接

十大经典排序算法

使用Dev-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++相关

蓝桥杯C++相关

[蓝桥杯Python]算法练习算法基础算法训练算法模板(持续更新)

回形取数(蓝桥杯)c++?

蓝桥杯c++省三需要多久

蓝桥杯c++和java选哪个容易得奖?