题面
如果x加上x的各个数字之和得到y,就说x是y的生成元。第一行输入一个t,接下来t行分别给出n(1小于等于n小于等于100000),求最小生成元。无解输出0.
示例
input
3
216
121
2005
output
198
0
1979
思路:我们可以应用一下逆向思维,先以范围内的所有数字为生成元打表出相对应的数字,再根据询问输出即可,注意特判。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 100010;
int arr[N];
int n, m;
int main()
{
for(int i = 1; i <= N; i ++)
{
int sum = i, tep = 0;
int tem = i;
while(tem > 0)
{
sum += tem % 10;
tem = tem / 10;
}
arr[i] = sum;
}
scanf("%d", &n);
while(n --)
{
scanf("%d", &m);
bool st = false;
for(int i = 1; i < m; i ++)
//一个数的生成元一定比此数小,所以不必全部遍历,以免不存在生成元的数也需要全部遍历
{
if(arr[i] == m)
{
printf("%d\n", i);
st = true;
break;
}
}
if(!st) printf("0\n");
}
return 0;
}
(萌新上路,有更好的方法或者写的有问题可以多多交流)