判斷閏年和實例——2005 第幾天

目錄

Description

最大公約數

最小公倍數

判斷質數和互質

通用閏年判斷方法

Analysis


 

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):  LCM(x, y) = \frac{x \times y}{GCD(x, y)}
int lcm(int x, int y) {
	int g = gcd(x, y);
	return x * y / g;
}

 

判斷質數和互質

  • 由質數的定義,可以得到如下判斷質數算法
  1. 若約數不等於它本身,則不是質數
  2. 否則,是質數
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),InterPrime(x, y) \Leftrightarrow GCD(x, y) == 1     ,可得判斷互質算法
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;
}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章