题目描述
冰墩墩666,YYDS!
你想知道一个十进制整数在哪些进制下,会出现“666”这样的数码串。
输入格式
第一行输入一个整数T (1≤T≤1000),表示样例的个数。
以后每行一个整数n (1≤n≤109)
输出格式
每行输出一个样例的结果,为若干个整数,按照进制从小到大排列,整数之间用一个空格隔开,行尾无空格。 如果不存在这样的进制,输出-1。
样例输入
3 666 2022 986037486样例输出
10 -1 11 12 12819
解题思路:具体过程看代码注释, 这里说下我是怎么找 maxb 的, 进制b越大,n转换成b进制后的数位就越少。所以要符合条件,至少是 6*b^2 + 6*b^1 + 6*b^0. 那么当 maxb*maxb*6 < n时,maxb还有机会可以++,当然这是粗略的计算,你要严谨点就 maxb*maxb*6 + maxb*6 + 6 <= n 吧。
AC代码:
#include <stdio.h>
int main()
{
int T,t,n,b,maxb,cnt,ans;
scanf("%d",&T);
while ( T --)
{
scanf("%d",&n);
ans = 0; b = maxb = 7; // 要出现666,进制最小从 7 开始。 b 是当前进制,maxb是最大进制
int record[50] = {0}, rember[30] = {0};
for ( ; maxb*maxb*6 < n; maxb ++); // 循环找到最大的进制b ——> maxb.
for ( ; b < maxb; b ++) // 从b 到 maxb 依次查找
{
cnt = 0; t = n; // 老生常谈了,进制转换
while (t){
rember[cnt++] = t%b;
t /= b;
}
for (int i = 2; i < cnt; i ++)
if (rember[i-2] == rember[i-1] && rember[i-1] == rember[i] && rember[i] == 6)
{record[++ans] = b; break;}
}
if (ans == 0) puts("-1"); // 没有输出0
else
{
for (int i = 1; i < ans; i ++) // 有则根据登记依次输出
printf("%d ",record[i]);
printf("%d\n",record[ans]);
}
}
return 0;
}