一步一步详解高斯日记
這是有一年的藍橋杯的題目,感覺挺有趣的
意思就是高斯有個習慣,記日期的時候喜歡只用數字來記,比如如果你2001年一月一日出生的話,你活到2002年1
月一日,他就會寫個366。大致意思就是你現在的時間減去個出生的時間+1就是這個數字。
那么我們有沒有辦法將這個數字轉化為日期呢,比如告訴你這個數字是1000你能立刻告訴我是哪一年的幾月幾號嗎?
高斯的生日是1777-4-30,天數8113,問這一天的日期
這題是填空題要我寫肯定直接筆算,思路的話有兩種,一種是以四年為一周期,然后將天數除以周期,取余數,再將余數除以一年的天數,求得日期
另一種就是直接忽略閏年,用天數除以一年,然后算這么多年里有多少閏年,然后減去閏年數,最后余數是一年中的第多少天,這樣就好算了。
(值得注意的是算的時候記得先將天數減1,否則會多出一天,比如你今天出生,算明天的話,天數是二,這個時候你不能直接將你的出生日期加2算了,需要先減一再加,這個自己想想吧,弄懂了它的意思再類比一下就輕松多了。)
我們先從簡單的來好吧。
1、先忽略閏年,直接按一年365天算這樣好了
2、加上閏年。(其實這題最難的就是區分閏年這個檻了)
一、只求一年之內某個數的具體日期(非閏年)
下面這個程序有點問題for循環里不是個變量,填32的話,二月等小月份輸入的就是錯的了。
#include<stdio.h> main() {int Day,i,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};Day=65;for(i=0;Day>32;i++){Day=Day-a[i];}printf("%d-%d",i+1,Day); }后來想想,加上個a[i]就行了。
#include<stdio.h> main() {int Day,i,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};Day=60;for(i=0;Day>a[i];i++){Day=Day-a[i];}printf("%d-%d",i+1,Day); }
這里先填固定日期,不想讓程序復雜化。
其實這個程序核心最有趣的地方就是利用了數組。
我想了下有沒有辦法反轉一下呢,輸入日期可以獲得這是這一年的第多少天(非閏年)
還是挺有趣的不是,后面閏年的接著再寫
二、以1年1月1日為出生日加入區分閏年方法
#include<stdio.h> main() {int Day,i,j,k,a[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};j=0;printf("以1年1月1日為出生日:\n");printf("請輸入你要輸入的天數:\n");scanf("%d",&Day); for(i=0;Day>a[j][i];i++){if(j%4==0&&j%100!=0||j%400==0){j=0;Day=Day-a[j][i];}else{j=1;Day=Day-a[j][i]; } }k=i/12;i=i%12;printf("%d年-%d月-%d日",k+1,i+1,Day); }這個程序有個大問題,剛開始我沒注意。把數字算大了才知道這個i的值是沒有減周期的,它在循環里漲到24之后就不會繼續漲了,不信你可以輸入1000試試,后面的Day必定會是三位數
于是乎我又調試了好久終于搞好了!!!
#include<stdio.h> main() {int Day,i,j,k,a[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};j=0;k=0;printf("以1年1月1日為出生日:\n");printf("請輸入你要輸入的天數:\n");scanf("%d",&Day); //輸入你要的天數 for(i=0;Day>a[j][i];i++){if(j%4==0&&j%100!=0||j%400==0){j=0;Day=Day-a[j][i];}else{j=1;Day=Day-a[j][i]; }if(i>11){i=0;//這個i的值把我坑慘了,剛開始輸入的是1,找了好長時間都沒發現這個bug,就是調試的時候發現輸入397時間不對,也不知道哪里不對!!!k++;} }//for循環加if嵌套語句,兩層嵌套,一個判斷是否為閏年,一個保證i的循環在11以內 i=i%12; printf("%d年-%d月-%d日",k+1,i+1,Day); }
上面那個好像還是錯的,回頭改了,這個到1400多天就又錯了,工程過于復雜,棄了。
#include<stdio.h> main() {int Day,i,j,k,a[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};j=1;k=0;printf("以1年1月1日為出生日:\n");printf("請輸入你要輸入的天數:\n");scanf("%d",&Day); //輸入你要的天數 for(i=0;Day>a[j][i];i++){j=Day/365+1;if(j%4==0&&j%100!=0||j%400==0){j=1;Day=Day-a[j][i];}else{j=0;Day=Day-a[j][i]; }if(i>11){i=0;//這個i的值把我坑慘了,剛開始輸入的是1,找了好長時間都沒發現這個bug,就是調試的時候發現輸入397時間不對,也不知道哪里不對!!!k++;} }//for循環加if嵌套語句,兩層嵌套,一個判斷是否為閏年,一個保證i的循環在11以內 i=i%12; printf("%d年-%d月-%d日",k+1,i+1,Day); }三、輸入出生日,給定天數(距離元年一月一號),判斷年月日。
#include<stdio.h> main() {int j,i,k,y,Day=0,Day1=0,Day2=0,a[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};printf("請輸入年數:");scanf("%d",&j); printf("請輸入月數");scanf("%d",&y); printf("請輸入天數");scanf("%d",&Day2);for(;j>1;j--){if(j%4==0&&j%100!=0||j%400==0){k=1;}else{k=0;}for(i=0;i<12;i++){Day=Day+a[k][i];} }for(y=y-2;y>=0;y--){if(j%4==0&&j%100!=0||j%400==0){k=1;}else{k=0;}Day1=Day1+a[k][y];}Day=Day+Day1+Day2;printf("%d",Day);}
差不多可以了,頭都轉暈了,怪自己當時沒把輪廓圖畫好,搞得bug百出,頭疼!!!不能深陷進去了,沒能完成說明我底子不夠,等把基本功練夠了,隔個半年再回來做吧!!!這個先放棄吧!!!
陷進去之后整個人都陷入debug深淵中,不能自拔,程序員太苦命了。所以剛開始的策劃真的很重要,要不然像我這樣后面就爛尾了!
總結
以上是生活随笔為你收集整理的一步一步详解高斯日记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孤独的根号三是什么梗 孤独的根号三什么意
- 下一篇: 苹果手机查找不到位置是什么原因