7 27 計算天數及星期值

2021-10-16 17:23:59 字數 4294 閱讀 8150

微調1(基姆拉爾森公式求星期幾):

微調2:

微調3:

微調4:

終輸入年、月、日的值,資料之間以空格分隔。

資料之間以換行符分隔。

2012 3 31

734502

734562

734593

saturday

#include

int main ();

char b[7]

[10]=

;int n,y,r,i,s1=

0,s2=

0,s3=0;

scanf

("%d %d %d"

,&n,

&y,&r)

;for

(i=1

;i((i%4==

0&&i%

100!=0)

||i%

400==

0) s1+

=366

;else s1+

=365;if

((n%4==

0&&n%

100!=0)

||n%

400==

0) a[1]

=29; s2=s1;

for(i=

0;i1;i++

) s2+

=a[i]

; s3=s2+r;

printf

("%d\n%d\n%d\n%s\n"

,s1,s2,s3,b[s3%7]

);}

1、該**是通過求出總天數再對7求餘實現求算星期幾的,餘數只會是0,1,2,3,4,5,6,所以陣列b的元素順序應為"sunday",「monday」,「tuesday」,「wednesday」,「thursday」,「friday」,「saturday」。

2、非常重要的一點:月份對應的下標為(月份數-1),所以「計算公元1年1月1日到該日期前乙個月的月末的天數」的for迴圈的控制條件為(>=0&&《該月-1),1月份下標為0,2月份下標為1。

基姆拉爾森計算公式:w= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7

#include

int main ();

char b[7]

[10]=

;int n,y,r,i,s1=

0,s2=

0,s3=0;

scanf

("%d %d %d"

,&n,

&y,&r)

;for

(i=1

;i((i%4==

0&&i%

100!=0)

||i%

400==

0) s1+

=366

;else s1+

=365;if

((n%4==

0&&n%

100!=0)

||n%

400==

0) a[1]

=29; s2=s1;

for(i=

0;i1;i++

) s2+

=a[i]

; s3=s2+r;

int w=

(r+2

*y+3

*(y+1)

/5+n+n/

4-n/

100+n/

400)%7

;printf

("%d\n%d\n%d\n%s\n"

,s1,s2,s3,b[w]);

}

因為基姆拉爾森計算式直接求出的就是星期幾,所以w的取值只可能是1~7,分別對應"monday",「tuesday」,「wednesday」,「thursday」,「friday」,「saturday」,「sunday」。

所以陣列b的元素位置要進行調換。

#include

int main ();

char b[7]

[10]=

;int n,y,r,i,s1=

0,s2=

0,s3=0;

scanf

("%d %d %d"

,&n,

&y,&r)

;for

(i=1

;i((i%4==

0&&i%

100!=0)

||i%

400==

0) s1+

=366

;else s1+

=365;if

((n%4==

0&&n%

100!=0)

||n%

400==

0) a[2]

=29; s2=s1;

for(i=

1;i) s2+

=a[i]

; s3=s2+r;

printf

("%d\n%d\n%d\n%s\n"

,s1,s2,s3,b[s3%7]

);}

儲存月份天數的陣列月份對應下標的改變,使月份數等於下標。

看似只需改動一處,實則還改變了「計算公元1年1月1日到該日期前乙個月的月末的天數」的for迴圈的控制條件,由於當月的天數不用計算在內,故範圍為(>=1&&《該月)。同時計算二月份對應陣列位置變為a[2]。

#include

int main ();

char b[7]

[10]=

;int n,y,r,i,s1=

0,s2=

0,s3=

0,temp,j;

scanf

("%d %d %d"

,&n,

&y,&r)

;for

(i=1

;i((n%4==

0&&n%

100!=0)

||n%

400==

0) a[1]

=29;else a[1]

=28; s2=s1;

for(i=

0;i1;i++

) s2+

=a[i]

; s3=s2+r;

printf

("%d\n%d\n%d\n%s\n"

,s1,s2,s3,b[s3%7]

);}

改變了「從公元1年1月1日到該日期前一年的年末的天數」的計算方式。

採用for迴圈,利用臨時變數儲存每一年的天數,再加到總天數里。由於每次迴圈後2月份的天數a[1]都會發生改變,所以不只要有if,也要有else,即

if

((n%4==

0&&n%

100!=0)

||n%

400==

0) a[1]

=29;else a[1]

=28;

又因為計算「從公元1年1月1日到該日期前一年的年末的天數」的for迴圈結束後,a[1]的並不確定,所以在進行「計算公元1年1月1日到該日期前乙個月的月末的天數」時也要有else,即

if

((n%4==

0&&n%

100!=0)

||n%

400==

0) a[1]

=29;else a[1]

=28;

#include

int main ();

char b[7]

[10]=

;int n,y,r,i,s1=

0,s2=

0,s3=0;

scanf

("%d %d %d"

,&n,

&y,&r)

; s1=

(n-1)*

365+

(n-1)/

4-(n-1)/

100+

(n-1)/

400;

//每一年都當成365天,再加上閏年的個數,由於當年不計算在內,故總年數為n-1 if(

(n%4==0

&&n%

100!=0)

||n%

400==

0) a[1]

=29; s2=s1;

for(i=

0;i1;i++

) s2+

=a[i]

; s3=s2+r;

printf

("%d\n%d\n%d\n%s\n"

,s1,s2,s3,b[s3%7]

);}

Oracle 儲存過程 游標及計算天數的函式

create or replace package pkg general is type row cursor is ref cursor 返回指定日期的月份中有多少天 function daysinmonth rq date return number 返回指定日期離月底還有多少天 functi...

灰度共生矩陣及相關特徵值的計算 opencv

include include include include include using namespace std using namespace cv const int gray level 16 void getglcm horison mat input,mat dst 0度灰度共生矩陣...

深度緩衝中的深度值計算及視覺化

在渲染管線中的頂點變換中,介紹了頂點在各個座標空間的變換。變換到最後,是螢幕座標空間。在opengl中,螢幕空間座標的z值即是深度緩衝中的深度值。深度緩衝包含了乙個介於0.0和1.0之間的深度值,它將會與觀察者視角所看見的場景中所有物體的z值進行比較。本文將介紹深度值的計算,以及從深度值反向計算出相...