题目大意:
一个正整数如果能通过下面两条规则得到,则为一个"Yiding Number"
规则1:1是一个"Yiding Number".
规则2:如果n是一个"Yiding Number",那么5n + 13, 13n + 5, 5n - 13, 13n - 5也是一个"Yiding Number".
解题思路:
题目所给的规则2具有很强的递归性,所以......直接递归整起, 需注意的是一切"Yiding Number"的起源都是1,这是递归终止的边界之一.
代码及注解:
#include <iostream>
/*
单词:predicate 断言
*/
using namespace std;
/*
@param n 当前要判断的数
*/
bool predicate(int n) {
if (n <= 0) return false;
//n == 1说明当前通道能到达原始"1",即可以断定上级n为一个"Yiding Number"
if (n == 1) return true;
//四条通道,对应题目所提供的四种"Yiding Number" 求法
//注意:每条通道必须保证自身整除性,即如果一个数为3,则其只能走a通道
int a = (n - 13) % 5 == 0? (n - 13) / 5:0;
int b = (n - 5) % 13 == 0? (n - 5) / 13:0;
int c = (n + 13) % 5 == 0? (n + 13) / 5:0;
int d = (n + 5) % 13 == 0? (n + 5) / 13:0;
//四条路线满足其一即可判断但前数为一个 "Yiding Number"
return predicate(a) || predicate(b) || predicate(c) || predicate(d);
}
int main() {
int N,x;
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> x;
if(predicate(x)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}