欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FOJ Problem 1068 An Interesting Set

程序员文章站 2022-03-13 16:46:23
...

一,问题描述

FOJ Problem 1068 An Interesting Set

 题目翻译:

FOJ Problem 1068 An Interesting Set

二,问题分析

对于集合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;
}

 

相关标签: FOJ