这道题可以用数组记录每一个完美数组(以及他的序号)
也可以给出序号后用循环算出他的值(不用数组)

用数组的优势是在访问量大是可以有效减少程序运行时间(等于是一次把活干完,之后你要一个我给一个)
不用数组的优势是可以减小内存的使用(类似于你要一个东西,我马上去造好了给你)

解析直接写在代码注释里了

不用数组的解法
#include <stdio.h>
int main()
{
    int T,find;
    int k;
    while (~scanf("%d", &T))//有输入时执行循环体内的语句
    {
        for (int i = 1; i <= T; i++)//读入t组数据
        {
            scanf("%d", &k);
            int count = 1;
            for (int j = 19; count <= k; j=j+9)//第一个完美数字时19,所以从19开始寻找完美数字(当然从1开始也可以)
            {
                int boss = j;//boss存入j的值进行之后的位数和计算
                int sum = 0;
                while (boss != //boss=0时结束位数和计算
                {
                    sum = sum + boss % 10;//取个位的值
                    boss = boss / 10;
                }
                if (sum == 10)//满足完美数字的定义
                {
                    count++;
                    find = j;
                }
               
            }
            printf("%d\n", find);
        }
    }
    return 0;
}



用数组的解法(我的解法)
#include<iostream>
using namespace std;
int nx[10005];
int main(){
    //10000
    int cnt=0;
    for(int i=0;cnt<=10005;i++){//将所有完美数字按序号存入数组(因为我从0开始存储,所以可以看到在最后一行输出时,我输出的是数组中a-1的值
        int n=i;
        int sum=0;
        while(n>0){
            sum+=n%10;
            n/=10;
        }
        if(sum==10){
            nx[cnt++]=i;
        }
    }
    int t;
    cin >> t;;
    for(int i=1;i<=t;i++){
        int a;
        cin >> a;
        cout << nx[a-1] << endl;
    }
}