有多少个基数 b 使得数字的基数 b 表示以 1 开头?

How many bases b are there such that the base b representation of number starts with a 1?

问题陈述是:

问题陈述-: Altaf 最近学习了数基并着迷了。

Altaf 了解到,对于大于 10 的基数,需要引入新的数字符号,并且惯例是使用英文字母表的前几个字母。例如,在 16 进制中,数字为 0123456789ABCDEF。 Altaf 认为这是不可持续的;英文字母表只有 26 个字母,所以这个方案最多只能工作到 36 进制。但这对 Altaf 来说不是问题,因为 Altaf 非常有创造力,可以在需要时发明新的数字符号。 (阿尔塔夫很有创意。)

Altaf 还注意到,在基数为 2 的情况下,所有正整数都以数字 1 开头!然而,这是唯一一个真实的基地。 Altaf 很自然地想知道:给定某个整数 N,有多少个基 b 使得 N 的基 b 表示以 1 开头?

输入格式: 输入的第一行包含一个整数 T,表示测试用例的数量。 T 测试用例的描述如下。 每个测试用例包含一行,其中包含一个整数 N(以 10 为底)。 输出格式 : 对于每个测试用例,输出包含碱基数 b 的单行,如果有无限个碱基,则输出 INFINITY。 约束: 1 <= T <= 10^5 0 <= N < 10^12 样本输入

 4

 6

 9

 11

 24

示例输出:

 4

 7

 8

 14

解释:

在第一个测试用例中,6 在基数 2、4、5 和 6 中有前导数字 1:610 = 1102 = 124 = 115 = 106。

我在 java 尝试过这个,但是在某些时候我的循环不工作它只接受第一个值,然后它就会退出循环!!谢谢

我的代码:

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      
        Scanner sc = new Scanner(System.in);
        long n,i,j,k,m;
        long count=0,rem1,index;
        long rem[];
        rem = new long[(int)100];
        int t = sc.nextInt();
        for(i=1;i<=t;i++)
        {
            
            n = sc.nextInt();
            j=2;
            while(j<=n)
            {

            // for(j=2;j<=n;j++)
            // {
                index=0;
                m = j;
                while(n>0)
                {
                    rem1 = n%m;
                    rem[(int)index++] = rem1;
                    n = (long) (n / m);
                }
                // for(k=index-1;k>=0;k--)
                // {
                    if(rem[1]==1)
                    {
                        count++;
                    }
                // }
                
                j++;
            }
            System.out.println(count);
                            
            // }
        }
        
      
    }
} 

我不确定我是否遵循了循环中的逻辑(而且,你自己也承认,那里有问题)。

循环的逻辑(即“多少个碱基表示数字 N 以 1 开头”)可以大大简化。

第一步是找到表示数字 N 所需的基数 B 的最高幂。这由 logb(n) 给出,截断为最接近的整数。 Java 没有带可变基数的 built-in 对数函数,但是您可以通过计算 log(n)/log(b) 得到这个结果。
然后,你需要找到这个位置的数字。这可以通过使用整数除法将 N 除以 Bpower 来计算。
从这里开始,你只需要检查结果是否为1,如果是,记录下来。

把它们放在一起,你会得到这样的结果:

private static int howManyBasesStartWithOne(int num) {
    int count = 0;
    for (int i = 2; i <= num; ++i) {
        int highestBase = (int) (Math.log(num) / Math.log(i));
        int leadingDigit = num / (int) Math.pow(i, highestBase);
        if (leadingDigit == 1) {
            ++count;
        }
    }
    return count;
}