生成元
如果x加上x的各个数字之和得到y,就说x是y的生成元。给出n(1≤n≤100000),求最小 生成元。无解输出0。 例如,n=216,121,2005时的解分别为198,0,1979。
输入演示
3 216 121 2005 (注意:第一行输入代表将要输入的实验数据组数。)
输出演示
198 0 1979
分析
本题看起来是个数学题,实则不然。假设所求生成元为m。不难发现m<n。换句话说, 只需枚举所有的数字m<n,看看有没有哪个数是n的生成元。 可惜这样做的效率并不高,因为每次计算一个n的生成元都需要枚举n-1个数。有没有更快的方法?当然有:只需一次性枚举100000内的所有正整数m,标记“m加上m的各个数字之和得到的数有一个生成元是m”,最后查表即可。
代码展示
#include
<iostream
>
#define maxn
100005
int ans
[maxn
];
using namespace std
;
int
main()
{
int
T, n
;
memset(ans
, 0, sizeof(ans
));
for (int m
= 1; m
<maxn
; m
++)
{
int x
= m
, y
= m
;
while (x
>0)
{
y
+= x
% 10;
x
= x
/ 10;
}
if (ans
[y
] == 0 || ans
[y
]>m
)
{
ans
[y
] = m
;
}
}
cin
>> T;
int
*a
= new int[T];
for (int j
= 0; j
< T; j
++) {
cin
>> n
;
a
[j
] = n
;
}
for (int j
= 0; j
< T; j
++) {
n
= a
[j
];
cout
<< ans
[n
] << endl
;
}
return 0;
}