有多少个基数 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;
}
问题陈述是:
问题陈述-: 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;
}