问题描述
问题陈述是:
问题陈述-: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;
}