こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです!
私のコラム「DailyBlueBridge」に注目してください。このコラムの主な機能は、近年のBlue Bridge Cupの地方大会と決勝戦の実際の質問を共有し、アルゴリズムのアイデア、データ構造、およびあなたが学ぶのを助けるためにそこに存在する他のコンテンツより多くの知識と技術に!
タイトル:バースデーキャンドル
ある人は、ある年から毎年誕生日会を開き、そのたびに自分の年齢と同じ数のろうそくを吹き消します。
今数えて、彼は236本のろうそくを吹き消しました、
彼は何歳で誕生日パーティーを始めましたか?
彼が誕生日パーティーを始めた年齢を記入してください
注:送信した内容は整数です。冗長なコンテンツや説明文は入力しないでください。
問題解決のアイデア:
この問題を解決するには、2つの方法があります。1つは、特定の年齢から始めて上に向かって増加するという従来の考え方と、特定の年後にキャンドルの数が236に等しくなるかどうかを判断する方法です。 -次の時代から判断して、ろうそくの数が正確に236に等しい年までが得られます。
2番目の方法は比較的単純ですが、アイデアは簡単ではありません。等差数列を使用して解き、毎年キャンドルを追加します。1年目は首相、何年続くかはフェーズ数です。 、許容値は1、最初のn年の合計は236で、年数を列挙するだけですが、取得された年齢が整数であるかどうかの判断に注意してください。そうでない場合、多くの結果が得られます。
回答のソースコード:
ソリューション-従来の考え方
public class Year2016_Bt2 { public static void main(String[] args) { int ans = 1; int count = 0; for (int i = 1; i <=236; i++) { for (int j = i; j <= 236; j++) { count+=j; if (count==236) { ans=i; break; } if (count>236) { break; } } if (count==236) { break; } count=0; } System.out.println(ans); } }
2番目の等差数列を解く
public class Year2016_Bt2_2 { public static void main(String[] args) { int ans = 0; //枚举已经过了的生日的年数n for (int n = 1; n < 100; n++) { //判断得到的年龄是不是整数 if ((236-(n*(n-1)/2))%n==0) { int year = (236-(n*(n-1)/2))/n; System.out.println(year); } } } }
サンプル出力:
解決策1の出力:
解決策2の出力: