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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章