题目描述
一个10进制无前导0的整数a,如果a有偶数位,只含有0和1的数码,且从左到右和从右到左读都是一样的,那么我们称其为“完美回文数”。 比如,1001,11这些都是完美回文数,而12,1010,1,101这些都不是“完美回文数”。 请问一个整数n等于最少多少个完美回文数的和?
输入
第一行是样例数T(1≤T≤1000)。 以后每行一个样例,为一个整数n(1≤n≤105)
输出
每行输出一个样例的结果,如果n不能由完美回文数累加得到,输出0。
样例输入
5 1 11 1012 2002 3333样例输出
0 1 2 2 3
解题思路:在数据给的 1e5内,只有 11、1001、1111 三个数符合完美回文数的性质,所以只有这三个相加得到的数才是有 >0的解 的n。 那么就用 11、1001、1111这三个数组合尝试,看相加是否能得到n就行。
AC代码:
#include <stdio.h>
const int N1 = 11, N2 = 1001, N3 = 1111;
int main()
{
int T;
scanf("%d",&T);
while ( T --)
{
int n,ans,flag;
scanf("%d",&n);
flag = 0;
if ( n % 11 != 0) ans = 0;// 因为11、1001、1111都是11的倍数,所以不是11倍数的n是不可能有解的
else
{ // 暴力查找,因为题目要求最少的完美回文数之和,所以从最大的找起(N3)
for (int i = 0; i*N1 <= n; i ++){
for (int j = 0; j*N2 <= n; j ++){
for (int k = 0; k*N3 <= n; k ++){
if (i*N1 + j*N2 + k*N3 == n){
ans = i+j+k;
flag = 1;
break;
}
}
if (flag) break; // 提前跳出循环
}
if (flag) break; // 提前跳出循环
}
}
printf("%d\n",ans);
}
return 0;
}