Ⅰ C語言:求星期幾(求講解)
如何求某一天是星期幾? 請注意這樣一個事實,即從公元元年一月一日開始到現在,每一天都是連續的,而每個星期有7天,也是連續的,也就是說日期和星期是一對一的,沒有斷檔現象。我的基本思想是計算出當前天是從公元元年一月一日開始的第幾天,再利用星期的周期性來計算公元任何一天是星期幾。 假設當前年份為y,並忽略閏年,則從公元元年一月一日到y-1年共有365*(y-1)天,加上閏年多出來的天數,即加上1*((y-1)/4-(y-1)/100+(y-1)/400),"/"為整除,得:365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)。我們再補上從當前1月1日開始到當前天的天數e,即為所求。即:365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e。它的值即為當前天是從公元元年一月一日開始算起的第幾天。補上一個x(x是與公元元年一月一日是星期幾有關的一個0~6的整數),並將這個表達式賦給變數t,即:t=x+365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e再用t除以7,余幾即為星期幾(餘0為星期日)。 下面討論x的求法,如果知道公元元年一月一日是星期幾,就可以直接得到x的值,但現在公式還沒有求出來,不知道公元元年一月一日是星期幾。不過沒關系,畢竟知道最近的日期是星期幾。不妨看一下2001年1月1日是星期幾,結果是星期一,代入公式得t=x+730516,用730516除以7,得104355,余數是1,則為了保證2001年1月1日是星期一,取x 為0,所以公元元年一月一日也是星期一。至此,得到了完整的公式: t=365*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 再將它做一下改進,我們將公式變形為: t=(52*7+1)*(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 利用星期的周期性,將52*7+1從公式中刪除,得: t=(y-1)+((y-1)/4-(y-1)/100+(y-1)/400)+e 在我網路到的那個帖子找到了答案~~ http://..com/question/3696267.html
Ⅱ 用C語言計算這是第幾周
#include<stdio.h>
int main()
{
int d91,month,day,week,n=0;
scanf("%d%d%d",&d91,&month,&day);//依次輸入9月1日周幾,今天幾號
switch(month){
case 10:n+=30;break;
case 11:n+=61;break;
case 12:n+=91;break;
case 1:n+=122;break;
case 2:n+=153;break;
case 3:n+=183;break;
case 4:n+=214;break;
}
n=n+day-d91;
week=n/7;
printf("%d\n",week+1);
}
Ⅲ 怎樣用C語言程序計算每月的一號是星期幾
1、C語言根據日期判斷星期幾(使用基姆拉爾森計算公式)
演算法如下:
基姆拉爾森計算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日數,m表示月份數,y表示年數。
注意:在公式中有個與其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10則換算成:2003-13-10來代入公式計算。
以公元元年為參考,公元元年1月1日為星期一。
2、常式:
#include"stdio.h"
voidCaculateWeekDay(inty,intm,intd)
{
if(m==1||m==2){
m+=12;
y--;
}
intiWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
switch(iWeek)
{
case0:printf("星期一 ");break;
case1:printf("星期二 ");break;
case2:printf("星期三 ");break;
case3:printf("星期四 ");break;
case4:printf("星期五 ");break;
case5:printf("星期六 ");break;
case6:printf("星期日 ");break;
}
}
voidmain()
{
intyear=0,month=0,day=0;
printf("請輸入日期: 格式為:1900,1,1 ");
chartemp='1';
while(temp!='0')
{
scanf("%d,%d,%d",&year,&month,&day);
scanf("%c",&temp);
CaculateWeekDay(year,month,day);
printf("輸入0退出,其他繼續:");
scanf("%c",&temp);
}
}
Ⅳ 高手指導一下,怎樣用C語言編寫一個計算單雙周的程序,並能顯示這是第幾周,輸入一個日期定為單周,然後自
#include <stdio.h>
const char WEEK_DAYS_NAME[7][10]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
/*
設定一個最小的系統日期,並且指定改天是星期幾
*/
/*最小的系統日期年份,默認是 2000 年*/
const int START_YEAR = 2000;
/*日最小的系統日期月份,默認是 1 月*/
const int START_MONTH = 1;
/*最小的系統日期,默認是 1 號*/
const int START_DAY = 1;
/*最小的系統日期所在的星期,默認是星期六(2000年1月1日是星期六)*/
const int START_WEEK_DAY = 6;
/*
功能:
計算指定的 year 年 month 月的天數
*/
int getDaysOfMonth(int year ,int month)
{
const int daysOfMonth[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
// 閏年的二月份
if( month == 2 && ( (year%4==0 && year%100!=0) || year %400==0 ))
{
return daysOfMonth[month] +1;
}
else
{
return daysOfMonth[month];
}
}
/*
功能:
計算 year 年 month 月 day 日
距離
START_YEAR 年 START_MONTH 月 START_DAY 日
的天數
*/
int getDiffDays(int year ,int month , int day)
{
int diffDays = 0 ;
int y,m,d;
if(year == START_YEAR)
{
if(month == START_MONTH)
{
diffDays = day - START_DAY;
}
else
{
/*加上當月剩餘天數*/
diffDays += getDaysOfMonth(START_YEAR,START_MONTH) - START_DAY + 1;
/*加上整月的天數*/
for(m = START_MONTH + 1 ; m < month ; m ++)
{
diffDays += getDaysOfMonth(START_YEAR,m);
}
/*加上當月剩餘天數*/
diffDays += day -1;
}
}
else
{
/*加上當月剩餘天數*/
diffDays += getDaysOfMonth(START_YEAR,START_MONTH) - START_DAY + 1;
/*加上整月的天數*/
for(m = START_MONTH + 1 ; m <= 12 ; m ++)
{
diffDays += getDaysOfMonth(START_YEAR,m);
}
/*加上整年的天數*/
for(y = START_YEAR+1 ; y < year ; y ++)
{
/*如果是閏年*/
if((y%4==0%y%100!=0) || y%400==0)
{
diffDays += 366;
}
else
{
diffDays += 365;
}
}
/*加上整月的天數*/
for(m = 1 ; m < month ; m ++)
{
diffDays += getDaysOfMonth(year,m);
}
/*加上當月的天數*/
diffDays += ( day - 1 );
}
return diffDays;
}
/*
功能:
計算 year 年 month 月 day 日
距離
START_YEAR 年 START_MONTH 月 START_DAY 日
已經過了多少周
*/
int getDiffWeeks(int year ,int month , int day)
{
int diffDays ,diffWeeks;
// 距離系統最小時間已經過去的天
diffDays= getDiffDays(year,month,day);
diffWeeks = diffDays/7;
// 修正已經過去的周
if((START_WEEK_DAY + diffDays % 7 )> 7)
{
diffWeeks++;
}
// debug
//printf("%d %d %d\n",diffDays,diffWeeks,(START_WEEK_DAY + diffDays % 7 ) % 7);
return diffWeeks;
}
/*
功能:
計算 year 年 month 月 day 日 是星期幾
星期一 = 1
星期二 = 2
...
星期六 = 6
星期天 = 0
*/
int getWeekDay(int year ,int month , int day)
{
int diffDays= getDiffDays(year,month,day);
return (START_WEEK_DAY + diffDays % 7 ) % 7;
}
int main(int argc, char *argv[])
{
// 設定的開始計算單雙周的第一天
int firstWeekYear,firstWeekMonth,firstWeekDay;
// 要查詢天
int queryYear,queryMonth,queryDay;
// 相差的天數
int diffDays;
// 相差的周數
int diffWeeks;
printf("輸入要設為第一周的日期:");
scanf("%d-%d-%d",&firstWeekYear,&firstWeekMonth,&firstWeekDay);
// 輸入要查詢的天,按 ctrl + z 退出
printf("輸入要查詢所在周的日期:");
while(scanf("%d-%d-%d",&queryYear,&queryMonth,&queryDay)!=EOF)
{
diffDays = getDiffDays(queryYear,queryMonth,queryDay) - getDiffDays(firstWeekYear,firstWeekMonth,firstWeekDay);
diffWeeks = getDiffWeeks(queryYear,queryMonth,queryDay) - getDiffWeeks(firstWeekYear,firstWeekMonth,firstWeekDay) + 1;
printf("%4d-%02d-%02d【%s】 是【%s周,第%3d周】。距離 %4d-%02d-%02d【%s】 已經過去了【%3d天】!\n",
queryYear,queryMonth,queryDay,
WEEK_DAYS_NAME[getWeekDay(queryYear,queryMonth,queryDay)],
(diffWeeks%2==1)?"單":"雙",
diffWeeks,
firstWeekYear,firstWeekMonth,firstWeekDay,
WEEK_DAYS_NAME[getWeekDay(firstWeekYear,firstWeekMonth,firstWeekDay)],
diffDays
);
}
return 0;
}
/*
輸入要設為第一周的日期:2011-9-1
輸入要查詢所在周的日期:2011-9-1
2011-09-01【星期四】 是【單周,第 1周】。距離 2011-09-01【星期四】 已經過去了【 0天】!
輸入要查詢所在周的日期:2011-9-2
2011-09-02【星期五】 是【單周,第 1周】。距離 2011-09-01【星期四】 已經過去了【 1天】!
輸入要查詢所在周的日期:2011-9-3
2011-09-03【星期六】 是【單周,第 1周】。距離 2011-09-01【星期四】 已經過去了【 2天】!
輸入要查詢所在周的日期:2011-9-4
2011-09-04【星期日】 是【單周,第 1周】。距離 2011-09-01【星期四】 已經過去了【 3天】!
輸入要查詢所在周的日期:2011-9-5
2011-09-05【星期一】 是【雙周,第 2周】。距離 2011-09-01【星期四】 已經過去了【 4天】!
輸入要查詢所在周的日期:2011-9-11
2011-09-11【星期日】 是【雙周,第 2周】。距離 2011-09-01【星期四】 已經過去了【 10天】!
輸入要查詢所在周的日期:2011-9-15
2011-09-15【星期四】 是【單周,第 3周】。距離 2011-09-01【星期四】 已經過去了【 14天】!
輸入要查詢所在周的日期:2011-10-1
2011-10-01【星期六】 是【單周,第 5周】。距離 2011-09-01【星期四】 已經過去了【 30天】!
輸入要查詢所在周的日期:2011-10-15
2011-10-15【星期六】 是【單周,第 7周】。距離 2011-09-01【星期四】 已經過去了【 44天】!
輸入要查詢所在周的日期:2011-10-30
2011-10-30【星期日】 是【單周,第 9周】。距離 2011-09-01【星期四】 已經過去了【 59天】!
輸入要查詢所在周的日期:2011-11-1
2011-11-01【星期二】 是【雙周,第 10周】。距離 2011-09-01【星期四】 已經過去了【 61天】!
輸入要查詢所在周的日期:2011-12-1
2011-12-01【星期四】 是【雙周,第 14周】。距離 2011-09-01【星期四】 已經過去了【 91天】!
*/