Min Base II
题目描述
一个十进制数n(10) 转成 b 进制数 ak,ak−1,…,a0¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯(b),b≥2,0≤ai<b(i=0,1,…,k)且无前导0,那么 n=∑ki=0aibi。 我们想求最小的基数b,使得所有系数ai出现的次数都是一样的。
输入
第一行输出一个整数T(1≤T≤10000),表示样例的个数。 以后每行一个样例,为一个十进制非负整数n(0≤n≤1018)
输出
每行输出一个样例的结果。
样例输入
5 0 1 4 5 1000000000000000000样例输出
2 2 3 3 44样例解释
第三个样例
10
进制数4,转成2
进制为100
,转成3
进制为11
。第四个样例
10
进制数5,转成2
进制为101
,转成3
进制为12
。
解题思路: 用个 books标记数组 记录每一位的数的出现次数,进制转换完之后,对比每个数的个数,如果不相同 进制b++,反之输出。
AC代码:
#include <stdio.h>
int main()
{
int T,b,tag;
__int64 n,temp;
scanf("%d",&T);
while ( T --)
{
b = 1;
scanf("%I64d",&n);
while (n)
{
temp = n, b += 1;
bool flag = true;
int books[70] = {0}; // 记录 b进制中ai的出现次数
while (temp)
{
books[temp%b]++;
if (temp/b == 0) tag = books[temp%b]; // 记录最后出现的ai 的个数
temp /= b;
}
for (int i = 0; i < b; i ++) // 验证所有系数 出现次数 是否一样
{
if (books[i] == 0) continue;
if (books[i] != tag) {flag = false; break;} // 如果有一位和记录的tag值不一样,重新开始。
}
if (flag) break;
}
if (!n) puts("2"); // 如果n==0, 最小进制为2
else printf("%d\n",b);
}
return 0;
}