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

问题描述

问题陈述是:

问题陈述-:Altaf最近了解了数字基础,并着迷于此。

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

Altaf还注意到以2为底的所有正整数都以数字1开头!但是,这是唯一正确的基础。因此,Altaf很自然地想知道:给定一些整数N,有多少个基数b使得N的基数b表示从1开始?

输入格式: 输入的第一行包含一个整数T,表示测试用例的数量。 T测试用例的描述如下。 每个测试用例由一行包含单个整数N(以10为底)的行组成。 输出格式 : 对于每个测试用例,输出一行包含基数b的单行;如果基数b无限,则输出INFINITY。 限制条件: 1

 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的最高幂。它由log b (n)给出,被截断为最接近的整数。 Java没有带有可变基数的内置log函数,但是您可以通过计算log(n)/ log(b)来获得此结果。
然后,您需要在该位置找到数字。这可以通过使用整数除法将N除以B power 来计算。
从那里开始,您只需要检查结果是否为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;
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...