常用数学知识整理——C/C++代码实现

10 篇文章 0 订阅


写在前头:因为不管生活中或者编程或者是在写数学题的时候,经常遇到一些数学概念模棱两可,可能有时候会用到,但是一段时间过去后记忆就模糊了,这时候又得翻书或者百度。特写此文章用于记忆。

一、平年 or 闰年

  • 平年365天,闰年366天。
  • 闰年判定:能被400整除、或者能被4整除但不能被100整除。其余的年份都为平年。
bool isLeapYear(int year)//求是否为闰年
{
	if (year % 400 == 0 || (year % 4 == 0 && year % 100))//能被400整除或者能被4整除且不被100整除
	{
		return true;
	}
	return false;
}

二、最大公约数

  • 最大公约数(Greatest Common Divisor,GCD),也称最大公因数、最大公因子。指两个或多个整数共有约数中最大的一个。
  • 最大公约数的求解方法有质因数分解法、短除法、辗转相除法、更相减损法等。
  • 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。

2.1 辗转相除法

int gcd(int a, int b)//求最大公约数,辗转相除法
{
	while (b)
	{
		int k = a % b;
		a = b;
		b = k;
	}
	return a;
}
//递归写法
int gcd (int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}

三、最小公倍数

  • 最小公倍数(Least Common Multiple)是指两个或多个整数公有的倍数中,除0以外最小的一个公倍数。
  • 最小公倍数的求解方法有分解质因数法与公式法两种。
  • 公式法:两个数的乘积等于这两个数的最大公约数与最小公倍数的积。先求这两个数的最大公约数,然后用两个数的乘积除以最大公约数就得到最小公倍数。
  • 利用公式法求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。

3.1 穷举法

取两数中的大值lcm,从该值lcm开始遍历,直到lcm能同时被a、b整除,即求得最小公倍数。

int LCM(int a, int b)//穷举法求最小公倍数
{
	if (a * b == 0)//只要有一个值为0,最小公倍数为0
		return 0;
	int lcm = a > b ? a : b;//求两者中的最大值
	while (1)
	{
		if (lcm % a == 0 && lcm % b == 0)//a和b同时整除lcm,lcm为最小公倍数
			break;
		lcm++;
	}
	return lcm;
}

3.2 公式法

最小公倍数 = 两数之积 / 最大公约数

int gcd(int a, int b)//求最大公约数,辗转相除法
{
	while (b)
	{
		int k = a % b;
		a = b;
		b = k;
	}
	return a;
}

int LCM(int a, int b)
{
	if (a * b == 0)//只要有一个值为0,最小公倍数为0
		return 0;
	return a * b / gcd(a, b);
}

四、质数 or 合数

  • 质数(Prime number),又称素数。指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。
  • 合数:大于1的自然数若不是素数,则称之为合数(也称为合成数)。
  • 2是质数。在所有的质数中,只有2是偶数,大于2的质数都是奇数

4.1 判断是否为质数

bool isPrimeNum(int num)//是否为质数
{
	if (num < 2)//0和1既不是质数也不是合数,负数就更不必说了
		return false;
	if (num < 3)//2是特殊的质数
		return true;

	for (int i = 2; i < num / 2; i++)
	{
		if (num % i == 0)//有1和本身外的第三个数,说明不是质数
			return false;
	}
	return true;
}

4.2 找到质数序列

bool getPrimeList(int low, int high, vector<int>& nums)//求low和high之间的质数序列
{
	if (low * high < 0)//输入有负数
		return false;
	if (low >= high)//输入有误
		return false;
	if (high < 2)//并无质数
		return true;
	if (high < 3)
	{
		nums.push_back(2);
		return true;
	}
	
	//正式地遍历
	while (low < high)
	{
		int flag = 0;
		for (int i = 2; i < low / 2; i++)
		{
			if (low % i == 0)
			{
				flag = 1;
				break;
			}
		}

		if (!flag)//是质数
		{
			nums.push_back(low);
		}
		low++;
	}
	return true;
}

五、奇数 or 偶数

这是一个简单的问题,直接贴出两种方法:求余法、位与法

5.1 求余法

bool isUnevenNum(int num)//是否为奇数。 even number为偶数
{
	if (num < 1)
		return false;
	if (num % 2)//能否被2整除
		return true;
	return false;
}

5.2 位与法

bool isUnevenNum(int num)//是否为奇数。 even number为偶数
{
	if (num < 1)
		return false;
	if (num & 1)//num的二进制最低位是否等于1,因为奇数的二进制最低位肯定是1
		return true;
	return false;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗夜无风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值