FOJ Problem 1068 An Interesting Set

一,问题描述

FOJ Problem 1068 An Interesting Set_第1张图片

 题目翻译:

FOJ Problem 1068 An Interesting Set_第2张图片

二,问题分析

对于集合S,满足两个条件(二者满足一个就行)

1.条件1,显然1-9是满足的,而其他数字的判断可以利用取余来实现

2.条件2,可以利用set集合的性质来判断,结合条件1,所有偶数都是满足集合S的

3.根据题意,正整数K是小于500的,我们采用打表法,把集合S的前500个元素都记录下来

三,问题解答

#include
#include
#include
using namespace std;

int num[505];					//用于存储满足S集合条件的数
set s;
set::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::value_type(i));
		}
	}
}
int main() {
	int N, k;
	cin >> N;
	init();
	while (N--) {
		cin >> k;
		cout << num[k] << endl;
	}

	return 0;
}

 

你可能感兴趣的:(FOJ)