给一个日期计算星期几(蔡勒公式和朴素做法)

本文介绍了两种计算特定日期对应星期的方法:通过日期差计算和使用蔡勒公式。提供了适用于1582年后的日期计算方法,并附带了C语言实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)第一种方法就是往后推,先计算出两个日期差的天数,然后对7取余。

(2)蔡勒公式。

公式 : w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7 (w代表星期几)

w对7取余得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六

注意:蔡勒公式只适合于1582年(中国明朝万历十年)10月15日之后的情形。

当年的1,2月要当成上一年的13,14月进行计算。

题目:

 

Description

acm的iphxer经常忘记某天是星期几,但是他记那天的具体日期,他希望你能写个程序帮帮他。

Input

每行有三个整数 year,month,day,日期在1600年1月1日到9600年1月1日之间。

Output

输出对应的星期,用一个整数表示;(星期一到星期六用1-6表示,星期日用0表示)

Sample Input

2011 3 6
1949 10 1
2011 4 1
1945 8 15

Sample Output

0
6
5
3

第一种方法代码实现:

#include<stdio.h>
#include<algorithm>
using namespace std;
int d[2][13]={
	{0,31,28,31,30,31,30,31,31,30,31,30,31},
	{0,31,29,31,30,31,30,31,31,30,31,30,31}};
	int a[7]={6,0,1,2,3,4,5};
int leap(int year)
{
	if((year%4==0&&year%100!=0)||year%400==0)
	return 1;
	else 
	return 0;
}
int leap1(int year)
{
	if((year%4==0&&year%100!=0)||year%400==0)
	return 366;
	else 
	return 365;
}
int main()
{
	int year,month,day,n,k,day2,day1,month1,year1;
	while(~scanf("%d%d%d",&year,&month,&day))
	{	
	int year1=1600,month1=1,day1=1;
		int m=year;
		day2=0;
		while(year>year1)
		{
			day2=day2+leap1(year-1);
			year--;
		}
		while(month>1)
		{
			day2=day2+d[leap(m)][month-1];
			month--;
		}
		day2=day2+day-1;

	 printf("%d\n",a[day2%7]);
	}
	return 0;
}

由于是多组测试数据可能会导致超时。

第二种方法更为省时。

第二种方法代码实现:

#include<stdio.h>
using namespace std;
int main(){
    int y,m,d,w;
    while(~scanf("%d%d%d",&y,&m,&d)){
        if(m==1||m==2){
            m+=12;y--;//一月二月当成上年的13,14月算 
        }
        w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
        printf("%d\n",w);
    }
}

需注意的是当年的一月和二月要当成上年的13,14月计算。

好的,以下是两道机器学习朴素贝叶斯的计算题,并给出答案: 1. 假设有一组训练数据,其中包括两个类别AB,每个类别各有3个样本。每个样本包含两个特征X1X2,它们的取值如下: | 样本编号 | 类别 | X1 | X2 | | -------- | ---- | -- | -- | | 1 | A | 0 | 1 | | 2 | A | 1 | 1 | | 3 | A | 1 | 0 | | 4 | B | 1 | 1 | | 5 | B | 1 | 1 | | 6 | B | 1 | 0 | 现在有一个新样本,它的特征X1=0,X2=0,请使用朴素贝叶斯算法预测它的类别。 答案: - 计算类别A类别B的先验概率: P(A) = 3/6 = 0.5,P(B) = 3/6 = 0.5 - 计算在类别A类别B下,特征X1=0X2=0的条件概率: P(X1=0 | A) = 1/3,P(X2=0 | A) = 1/3 P(X1=0 | B) = 0/3,P(X2=0 | B) = 1/3 - 计算在类别A类别B下,特征X1=0X2=0的联合概率: P(X1=0, X2=0 | A) = P(X1=0 | A) * P(X2=0 | A) = 1/9 P(X1=0, X2=0 | B) = P(X1=0 | B) * P(X2=0 | B) = 0 - 计算在特征X1=0X2=0的条件下,类别A类别B的后验概率: P(A | X1=0, X2=0) = P(X1=0, X2=0 | A) * P(A) / P(X1=0, X2=0) = (1/9) * 0.5 / ((1/9)*0.5 + 0) = 1 P(B | X1=0, X2=0) = P(X1=0, X2=0 | B) * P(B) / P(X1=0, X2=0) = 0 * 0.5 / (0 + 0.5) = 0 因此,根据朴素贝叶斯算法,可以预测这个新样本属于类别A。 2. 假设有一组训练数据,其中包括两个类别AB,每个类别各有3个样本。每个样本包含一个特征X,它的取值如下: | 样本编号 | 类别 | X | | -------- | ---- | --- | | 1 | A | 1 | | 2 | A | 2 | | 3 | A | 3 | | 4 | B | 2 | | 5 | B | 3 | | 6 | B | 4 | 现在有一个新样本,它的特征X=2,请使用朴素贝叶斯算法预测它的类别。 答案: - 计算类别A类别B的先验概率: P(A) = 3/6 = 0.5,P(B) = 3/6 = 0.5 - 计算在类别A类别B下,特征X=2的条件概率: P(X=2 | A) = 1/3 P(X=2 | B) = 1/3 - 计算在特征X=2的条件下,类别A类别B的后验概率: P(A | X=2) = P(X=2 | A) * P(A) / P(X=2) = (1/3) * 0.5 / ((1/3)*0.5 + (1/3)*0.5) = 0.5 P(B | X=2) = P(X=2 | B) * P(B) / P(X=2) = (1/3) * 0.5 / ((1/3)*0.5 + (1/3)*0.5) = 0.5 因此,根据朴素贝叶斯算法,无法预测这个新样本属于哪个类别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值