ガウスの日記
偉大な数学者ガウスには良い習慣があります。とにかく日記をつけてください。
彼の日記には特別な場所があります。彼は年、月、日を示すことはありませんが、代わりに次のような整数を使用します。4210
その後、人々はその整数が日付であることを知りました。これは、その日がガウスが生まれた翌日であることを示しています。これも良い習慣かもしれませんが、それは常に所有者に思い出させます:1日が経過しました、どれくらいの時間を無駄にするために使うことができますか?
ガウスは1777年4月30日に生まれました。
ガウスによって発見された重要な定理の日記には、5343と記されているため、1791年12月15日と計算できます。ガウスが博士号を取得した日の日記には8113のマークが付いています
ガウスが博士号を取得した年、月、日を計算してください。
回答を送信するための形式は次のとおりです:yyyy-mm-dd、例:1980-03-21
フォーマットに厳密に従い、ブラウザから回答を送信してください。
注:この日付のみを送信してください。説明文など、他の追加コンテンツは記述しないでください。
回答:1799-07-16
問題分析
方法1:Excelを使用して結果を直接計算できるため、注意が必要です。
方法2:プログラミング計算。アイデア:指定された開始時刻から翌日までをシミュレートし、指定された数値に加算すると、結果は目的の日付になります。次に、日数を加算する過程でうるう年があり、月の日数を加算した後、月は四捨五入され、その月は引き続き処理される必要があります。月が12に達した後に四捨五入されるので、これらの状況を判断してください。うるう年の2月末の数値は、うるう年でない2月末の数値と同じではないため、2月も2回判断する必要があります。別の場所があり、日数が追加されるたびにd ++が正しいので、判断が下されると、dは月末日より1つ多くなります。
最後に、プログラムを作成したら、タイトルの既存の例を使用して検証します。ループ-1の合計日数を取得することで、最終結果を得ることができます。
#include <iostream>
using namespace std;
bool isLeapYear(int y){
if(y % 4 == 0 && y % 100 != 0){
return true;
}else if(y % 400 == 0){
return true;
}
return false;
}
int main(int argc, char** argv) {
int y = 1777;
int m = 4;
int d = 30;
for(int i = 0; i < 8112; i++){
d++;
if(m == 12 && d == 32){
y++;
m = 1;
d = 1;
continue;
}
if((m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10) && d == 32){
m++;
d = 1;
continue;
}
if((m == 4 || m == 6 || m == 9 || m == 11 ) && d == 31){
m++;
d = 1;
continue;
}
if((m == 2) && isLeapYear(y) && d == 30){
m ++;
d = 1;
continue;
}
if((m == 2) && !isLeapYear(y) && d == 29){
m++;
d = 1;
continue;
}
}
cout << y << "-" << m << '-' << d;
return 0;
}
この質問から私が学んだのは、プログラミング思考を使って問題を考えて解決し、何をすべきか、どのようにそれを行うかを明確にすることです。それをどのように行うかについては、コンピューターを手放すという考えです。
先の道は長いです、さあ!