2016-12-23 35 views
-2

这个问题是在codechef竞赛中的一个问题。我已经在c。以下是我的代码:给定一个整数N,那里有多少个碱基b,这样N的碱基b表示以1?

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的d数字中的最小数字是b的数字是10...0b^(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是这些边界之内。