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