2016-12-23 3 views
-2

この質問は、codechef競技会の1つで尋ねられます。私はcで試しました。以下は私のコードです:いくつかの整数Nが与えられた場合、Nのベースb表現が1から始まるようにいくつのベースbがそこにあるか?

scanf("%d",&N); 
    count=0; 
    for(i=2;i<=N;i++) 
    { 

     c=a; 
     while(c>=i) 
      { 
       c=c/i; 
      } 
      if(b==1) 
      count++; 
    } 

    printf("%d\n",count); 

しかし、これは私に部分的なマークを与えています。より短い時間で解決できるか?もしそうなら、どうですか?

+0

「a」とは何ですか?それは「N」ですか? – Barmar

+0

ループで分割する代わりに、N base iのログを計算し、次に「i ** floor(log)」で除算します。 – Barmar

+0

どこで 'b'を設定しますか?それは 'c'でしょうか? – Barmar

答えて

0

先頭に1をつけて、bd桁の数字が10...0で、これはb^(d-1)です。

このような数字の最大値は2*b^(d-1)-1です。したがって、その範囲内で収まるN与えられた番号は適切な丸め付き

pow(0.5*(N+1), 1.0/(d-1)) <= b <= pow(N, 1.0/(d-1)) 

不等式で与えられているような塩基は、考慮にランダムな浮動小数点エラーを取って、あなたは直接bは、これらの境界の内側にあるどのように多くの整数カウントすることができます。

関連する問題