判断闰年和实例——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;
}
 

 

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