/*
最小生成元:如果数x加上各个数字之和得到y,就说x是y的生成元
这道题是要求一个数中的最小生成元
这道题想要介绍的方法称为——把数据离线
*/
#include <iostream>
#include <stdio.h>
#define MAXN 100010
using namespace std;
int digit[MAXN];//用来存放离线数据的数组
int main(void)
{
int T;
scanf("%d", &T);
//将数据离线的过程如下
for (int i = 1; i < MAXN; i++)
{//i所表示的当前数字的生成元,我想做的是通过i把这个生成元所对应的数字找出来
int temp = i, sum = i;
//因为要对i这个数值进行处理,所以建立一个副本temp
//sum表示生成元对应的数值,因为要加上它本身,所以这里直接等于i
while (temp)
{//各个位上的数字相加
sum += temp % 10;
temp /= 10;
}
if (sum < MAXN && !digit[sum])//!digit[sum]是为了保证生成元的值最小,因为两个不同的生成元可能指向同一个值,当然是前面的值最小啦
digit[sum] = i;//如果当前生成元所对应的数字小于MAXN
}
while (T--)
{
int n;
scanf("%d", &n);
printf("%d\n", digit[n]);
}
return 0;
}
UVA - 1583-Digit Generator
最新推荐文章于 2020-07-26 18:24:55 发布