目錄
Description
- 幾個常用算法:求最大公約數gcd和最小公倍數lcm,判斷互質和閏年
最大公約數
- gcd怎麼求呢?像下面這樣把它輾轉相除——啊,還沒除呢~像下面這樣把它輾轉相除,這種必須WWYEC
int gcd(int x, int y) {
int r = x % y;
while (r) {
x = y;
y = r;
r = x % y;
}
return y;
}
最小公倍數
- 公式(1):
int lcm(int x, int y) {
int g = gcd(x, y);
return x * y / g;
}
判斷質數和互質
- 由質數的定義,可以得到如下判斷質數算法,
- 若約數不等於它本身,則不是質數
- 否則,是質數
bool IsPrime(int a) {
int i;
for (i = 2; i * i <= a; i++)
if ((a % i) == 0)
break;
return i * i > a ? true : false;
}
- 類似地,互質的本質是式(2), ,可得判斷互質算法
bool IsInterprime(int x, int y) {
int g = gcd(x, y);
return g == 1 ? true : false;
}
- 另,獲取所有因數算法也顯然
int GetAllFactors(int a, int factors[]) {
int k = 0, i;
for (i = 1; i <= a; i++) {
if (!(a % i))
factors[k++] = i;
}
return k; // 這是數a的因數個數
}
通用閏年判斷方法
- 由閏年定義得判斷閏年算法
bool isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
Analysis
- 掌握以上幾個算法,可以非常輕鬆地上手某些計算機專業課考研題的編程題的第一步。
示例
#include <stdlib.h>
#include <stdio.h>
const int dattab[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
bool IsLeapYear(int y) {
return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0));
}
int main() {
int y, m, d;
while (~scanf("%d/%d/%d", &y, &m, &d)) {
int r = IsLeapYear(y) ? 1 : 0;
int n = 0;
for (int i = 0; i < m - 1; i++)
n += dattab[r][i];
n += d;
printf("%d\n", n);
}
return 0;
}