算法模版总结

在题目中带来模版总结

#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 100005
#define FOR(i, j, k) for(int i(j); i <= (k); ++i)
#define ROF(i, j, k) for(int i(j); i >= (k); --i)
#define pii std::pair<int,int>
#define pll std::pair<ll, 1l>
#define ALL(v) (v).begin(),(v).end()
using unl = __int128_t;
using namespace std;
using ll = long long;

class TransForm { //进制转换
public: 
    string intToA(int n, int radix) {   // n是待转换的数字 radix  进制 10 是指定的进制
        if (n == 0) return "0"; // 当n为0时,直接返回"0"

        string ans = "";
        do {
            int t = n % radix; //取模权重
            if (t >= 0 && t <= 9) ans += t + '0'; // 这个是用于 2 - 10 进制内的进制转换 转换为字符串
            else ans += t - 10 + 'A';    //大于10进制转换为字母所以要 +  'A' 转换为字符串
            n /= radix;
        } while (n > 0);

        reverse(ans.begin(), ans.end());

        return ans;
    }

public:
    long int AToB(string s,int radix) {
        
        return strtol(s.c_str(), nullptr, radix);
    }
public:
    void MAIN() {
        int n,m; // n为转换为m进制
        string s; cin >> n >> s >> m; 
        ll A = AToB(s,n); //n进制转换为10进制
        string t = intToA(A,m); //10 进制转换为m 进制
        cout << t << endl;
    }
};


bool Find(ll n) {
      
    std::string s = std::to_string(n);   //数字转化为字符串,字符串转化为数字 ( -'0' ) 或者通过函数

    if (s.find("233") != std::string::npos) return true;  //KMP查找字符串

    return false;  
    
}

//思路提供: 
//去重
// sort(ALL(ans));
// ans.erase(unique(ALL(ans)), ans.end());
 // isdigit();判断是否为数字
 //多个变量尽量通过关系用一个变量表示

class Solution {
public: 
    void solve() {

    }
public: //最小公倍数
     int lcm(int a, int b)
    {
        return (a * b) / gcd(a, b);
    }
    //最大公约数
    int gcd(int a, int b) {
        return b > 0 ? gcd(b,a % b) : a;
    }
public:
    int IsPrime(int n)  //质数判断
    {
        int i;
        if(n<2||(n!=2&&n%2==0))//n小于2或者n是不等于2的偶数,必然非素数
            return 0;
        else//这里n都是奇数
        {//这里使用上面刚提到的写法,用i代替开根号的过程
            for(i=3;i*i<=n;i+=2)//这里注意循环条件
            {//2必然不是因子,从3开始,每次递增2,直到sqrt(n)为止
                if(n%i==0)
                    return 0;
            }
            return 1;
        }
    }
public: //快速幂
    int qmi(ll a, ll b, ll p) // 对 p 取模 a的b次幂
    {
       ll res = 1;
       while(b) 
       {
           if (b & 1) res = res * a % p;
           a = (a * a) % p,b >>= 1;
       }
       return res;
    }
};



signed main() {
    std::cin.tie(0) -> std::ios::sync_with_stdio(false);
    std::cout.tie(0) -> std::ios::sync_with_stdio(false);
    
#if Run
    int _;std::cin>>_;while(_--) Solution().solve();
#else
    Solution().solve();
#endif
    return 0;
}

 模版介绍:

1.进制转化部分

class TransForm { //进制转换
public: 
    string intToA(int n, int radix) {   // n是待转换的数字 radix  进制 10 是指定的进制
        if (n == 0) return "0"; // 当n为0时,直接返回"0"

        string ans = "";
        do {
            int t = n % radix; //取模权重
            if (t >= 0 && t <= 9) ans += t + '0'; // 这个是用于 2 - 10 进制内的进制转换 转换为字符串
            else ans += t - 10 + 'A';    //大于10进制转换为字母所以要 +  'A' 转换为字符串
            n /= radix;
        } while (n > 0);

        reverse(ans.begin(), ans.end());

        return ans;
    }

public:
    long int AToB(string s,int radix) {
        
        return strtol(s.c_str(), nullptr, radix);
    }
public:
    void MAIN() {
        int n,m; // n为转换为m进制
        string s; cin >> n >> s >> m; 
        ll A = AToB(s,n); //n进制转换为10进制
        string t = intToA(A,m); //10 进制转换为m 进制
        cout << t << endl;
    }
};

上面的代码能将任意进制转化为任意进制(2 - 32) 

2.最大公约数

//最大公约数
  int gcd(int a, int b) {
        return b > 0 ? gcd(b,a % b) : a;
    }

3.最小公倍数

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

4.快速幂

 int qmi(ll a, ll b, ll p){// 对 p 取模 a的b次幂
       ll res = 1;
       while(b) 
       {
           if (b & 1) res = res * a % p;
           a = (a * a) % p,b >>= 1;
       }
       return res;
    }

5.质数判断

    int IsPrime(int n)  //质数判断
    {
        int i;
        if(n<2||(n!=2&&n%2==0))//n小于2或者n是不等于2的偶数,必然非素数
            return 0;
        else//这里n都是奇数
        {//这里使用上面刚提到的写法,用i代替开根号的过程
            for(i=3;i*i<=n;i+=2)//这里注意循环条件
            {//2必然不是因子,从3开始,每次递增2,直到sqrt(n)为止
                if(n%i==0)
                    return 0;
            }
            return 1;
        }
    }

 

包含各式计算方法 + 助力力竞赛拿高分 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值