这道题可以用数组记录每一个完美数组(以及他的序号)
也可以给出序号后用循环算出他的值(不用数组)
用数组的优势是在访问量大是可以有效减少程序运行时间(等于是一次把活干完,之后你要一个我给一个)
不用数组的优势是可以减小内存的使用(类似于你要一个东西,我马上去造好了给你)
解析直接写在代码注释里了
不用数组的解法
#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; } }