C - 末尾のゼロ(III)二分

あなたのタスクは、最小の自然数を見つけることです  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:不可能

実際に、私は私は書く、と私はあまりにも料理(これが原罪である)であったことをするために、他の方法、ない意味を感じない、このトピックを考え、特にうんざりしています

いくつかのアイデアがあります:: 0は階乗があるとして、数2及び5を参照するキーを表示され、乗算され、すべては彼が少数または5 2いくつかが含まれてかどうかを確認するために数を開けたくない,,など、10は、唯一の5,2及び5に分けることができ、そして

25は、2つの5がある5,5に分けることができます。数字のセットでは、数2の5の5番にそう直接行うよりも優れている必要があり友達になることができます!

長い長いことを忘れないでください 

ACコード:

書式#include <iostreamの> 
の#include <cstdioを>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
LL和(LLのX){ 
    LL ANS = 0 一方、(X)
    { 
        ANS + = X / 5 
        X = X / 5 
    } 
    戻りANS。
} 

int型のmain()
{ 
    int型の  T。
    scanf関数(" %のD "、&T)。
    以下のためにint型私は= 1 ; I <= T; I ++
    { 
        LL N-; 
        scanfの(" %のLLD "、およびN-)を、
        LLは左 =を1、右= 1000000000、ANS = 0 、MID;
         ながら <=左(右)
        { 
            MID =(左+右)/ 2 ;
             IFを(SUM(MID)== N-){ 
                ANS = MID;  =半ば1 ; 
            } //最小は、11及び10として必ずしもない見つける二階乗0を生成することができる
            他の IF(SUM(MID)> N){=半ば1 
            } 
            {  =ミッド+ 1 
            } 
        } 
        
        もし(ANS> 0 
            のprintf(" ケース%D:%LLDする\ n " 、I、ANS)。
        他の 
        { 
            のprintf(" ケースは%d:不可能\ nを" 、I); 
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/11247701.html