トピック:
末尾のゼロ
あなたのタスクは、最小の自然数を見つけることです Nをするように、 N! 正確に含まれている Qの 10進数で歩道上のゼロを。あなたが知っているように Nを!= 1 * 2 * ... * N。例えば、5!= 120、120は、歩道上に1つのゼロを含んでいます。
入力
入力は整数で始まり T(10000以下)示す、 テストケースの数。
各ケースは、整数含ま Q(1つの≤Q≤10 8) ラインです。
出力
各場合について、ケース番号と印刷 Nを。解決策が見つからない場合は、印刷する 「不可能」。
サンプル入力
3
1
2
5
サンプル出力
ケース1:5
ケース2:10
ケース3:不可能
ソリューション:
これは、nの主なアイデアの定義を求めて、古典的な二分法の質問です!2つの番号0の関数の後。
Nシーク!番号の後ろに0、CSDNのブログで私の記事を参照してください。https://blog.csdn.net/qq_45328552/article/details/98206579
私は、コード内の二分法を分析します。
書式#include <iostreamの> 使用して名前空間はstdを、 typedefの長い長いLL。INT 検索(LLのN) { int型の和= 0 。一方、(N) { 合計 + = N / 5 。 N / = 5 。 } 戻り値の和。 } int型のmain() { // freopenは( "INPUT.TXT"、 "R"、STDIN)。 // !注释注释!!! int型T、N。 cinを >> トン。以下のための(int型私は= 。1 ; I <= T; I ++は) { CIN >> N-; LLヘッド = 0、= 5E8 +尾5。、MID; // 2点頭部と尾部との中間を規定する、タイプとして定義は長い長い述べ、その二点ため一般的に、非常に多数の必要とされる しばらく(ヘッド<=尾)// 条件が半周期を満たす必要がある、ヘッドの端部はより少ない { MID =(頭+尾)/ 2 ; IFヘッド(検索(MID)<n-は)= MID + 1。 ; // 。検索(ミッド)がn未満である場合、値は右を見つけなければならない、と半ば半ば番号を左に満たされていないので、最初に等しいを聞かせて1 +中旬 他の IF(検索(ミッド)> N-)ミッド尾= - 1 ; //検索(MID)がnより大きい場合、値は左され、右の中間中間要件を満たし、従ってので尾に等しくない1-MID。 他 BREAK ; //は、それが値見て決定されているので、ループの外に等しいです } IF(ヘッド>尾)のprintf(" ケース%のD:インポッシブル\ N- "、I); // ヘッド>尾完全に記載されているバイナリ数も一致する出力されませんfalseに 他のprintf(" ケースDの%:% D \のN- "、I、MID - MIDの%5); // 上記のコードでは、これが検索(MID)= nで修飾されていることを知ることができ、出力することができる } // 中間中間出力理由5%です同じ番号の後ろ6,7,8最小数0~5階乗の階乗は、番号0を繰り返し、本明細書に記載される条件を満たして6,7,8 6,7,8%を差し引く、同じです図5は、それが条件満たす最小値となる 戻り 0 ; }