日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一步一步详解高斯日记

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步一步详解高斯日记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是有一年的藍橋杯的題目,感覺挺有趣的
意思就是高斯有個習慣,記日期的時候喜歡只用數字來記,比如如果你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); }


這里先填固定日期,不想讓程序復雜化。
其實這個程序核心最有趣的地方就是利用了數組。

我想了下有沒有辦法反轉一下呢,輸入日期可以獲得這是這一年的第多少天(非閏年)

#include<stdio.h> main() {int Day,i,j,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};printf("請輸入現在的月份:\n");scanf("%d",&j);printf("請輸入今天是幾號:\n");scanf("%d",&Day);for(i=0;i<j-1;i++){Day=Day+a[i];}printf("這是今年的第%d天",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深淵中,不能自拔,程序員太苦命了。所以剛開始的策劃真的很重要,要不然像我這樣后面就爛尾了!

總結

以上是生活随笔為你收集整理的一步一步详解高斯日记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。