最大公约数、最小公倍数、unordered_map使用pair类型

unordered_map 把pair作为key

class hash_pair
{
public:
    size_t operator()(const pair<int, int>& p) const
    {
        auto p1 = hash<int>()(p.first);
        auto p2 = hash<int>()(p.second);
        return p1^p2;
    }
};

unordered_map<pair<int, int>, bool, hash_pair> visited;

使用逻辑运算符替代判断语句

  • A && B, 如果A为假, B将不会执行, 如果A为真, B才会执行
  • A || B , 如果A为真, B将不会执行, 如果A为假, B才会执行
// 计算1+2+3+4+...+n
int f(int n)
{
	// if (n == 0) return 0
	// return f(n-1) + n;
	n && (n += f(n-1));
	return n;
	// 如果直接返回 return n && (n+f(n-1)) 会是一个逻辑值1或0
}

默认参数

  • 默认参数之后的所有参数都必须是默认参数 (默认参数必须放在最后)
  • 不要重载一个带默认参数的函数
class Test
{
public:
    int func(int a)
    {
        return a;
    }

    int func(int a, int b = 1)
    {
        return a + b;
    }
} ;

Test().func(1); // 有歧义

指针常量

  • C++中引用的本质就是指针常量, 因此指针常量必须要初始化, 就好像引用必须要初始化.

最大公约数, 最小公倍数

#include <iostream>
using namespace std;

int gcd(int a, int b)
{
    if (a < b)
    {
        swap(a, b);
    }
    if (b == 0)
        return a;
    return gcd(b, a%b);
}
int gcm(int a, int b)
{
    int gcd_val = gcd(a,b);
    return a * b / gcd_val;
}

int ngcd(int arr[], int n)
{
    if(n == 0) return arr[n];
    return gcd(arr[n-1], ngcd(arr, n-1));
}

int ngcm(int arr[], int n)
{
    if (n == 0) return arr[0];
    return gcm(arr[n-1], ngcm(arr, n-1));
}

int main()
{
    cout<<gcd(100, 120)<<endl;
    cout<<gcm(33, 3)<<endl;
    int arr[] = {20, 30, 25, 10};
    cout<<ngcd(arr, 4)<<endl;
    cout<<ngcm(arr, 4)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值