[ブルーブリッジカップ]試験トレーニング2013C ++ Aグループ質問1ガウスの日記

ガウスの日記 

    偉大な数学者ガウスには良い習慣があります。とにかく日記をつけてください。

    彼の日記には特別な場所があります。彼は年、月、日を示すことはありませんが、代わりに次のような整数を使用します。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;
}

この質問から私が学んだのは、プログラミング思考を使って問題を考えて解決し、何をすべきか、どのようにそれを行うかを明確にすることです。それをどのように行うかについては、コンピューターを手放すという考えです。

先の道は長いです、さあ!

おすすめ

転載: blog.csdn.net/weixin_44566432/article/details/115085669