一,問題描述
題目翻譯:
二,問題分析
對於集合S,滿足兩個條件(二者滿足一個就行)
1.條件1,顯然1-9是滿足的,而其他數字的判斷可以利用取餘來實現
2.條件2,可以利用set集合的性質來判斷,結合條件1,所有偶數都是滿足集合S的
3.根據題意,正整數K是小於500的,我們採用打表法,把集合S的前500個元素都記錄下來
三,問題解答
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int num[505]; //用於存儲滿足S集合條件的數
set<int> s;
set<int>::iterator it;
bool isin(int a) {
int total = 0; //用於求和
int muti = 1; //用於求乘積
int num;
//條件一,需要判斷是否偶數,偶數肯定屬於集合S(2是屬於集合S的)
if (a % 2 == 0) {
it = s.find(a / 2); //判斷a/2是否處於集合中
if (it != s.end()) { //處於集合S中
return true;
}
}
//條件二
while (a) {
num = a % 10;
if (num == 0) {
return false;
}
total += num;
muti *= num;
a /= 10;
}
if (total != muti) { //各數字和與乘積不等,不滿足條件
return false;
}
return true;
}
//打表初始化
void init() {
int i, j;
for (i = 1, j = 1; j <= 500; i++) { //i一直增加,直到num數組存儲滿,即打表完成時
if (isin(i)) {
num[j++] = i;
s.insert(set<int>::value_type(i));
}
}
}
int main() {
int N, k;
cin >> N;
init();
while (N--) {
cin >> k;
cout << num[k] << endl;
}
return 0;
}