在网上看到一个非常巧妙高级的计算思想,正好C语言作业有计算一年中第几天的题,就借鉴下算法。
#include <stdio.h>
#include <stdlib.h>
struct {
int month;
int day;
int year;
}date;
int main()
{
int m1;
printf("请输入年月日");
scanf("%d",&date.year,&date.month,&date.day);
m1 = (date.month+9)%12;
if(m1<10){
date.day = (m1*306 + 5)/10 + (date.day - 1);
if(((date.year%4==0)&&(date.year%100!=0))||date.year%400==0)
date.day = date.day+60;
else date.day = date.day+59;
}
else
if(m1==2) date.day = date.day+31;
printf("这是%d年中的第%d天",date.year,date.day);
return 0;
}
算法解析
m1是用来计算该月到三月的间隔月数,如果m1小于10说明是二月之外的任何一个月。(m1*306 + 5)/10 用于计算到当前月到3月1日间的天数,306=365-31-28(1月和2月),5是全年中不是31天月份的个数。
然后判断是闰年则加60(1月和2月),不是就加59。
最后如果m1大于10,说明是一个月。若是二月就加31(一月的天数),是一月就直接输出。