Yiding Number
Problem Description
A positive integer is called a “YidingNumber” when it can be obtained by one of the following two rules.
Rule 1: The positive integer 1 is a “YidingNumber”.
Rule 2: If n is a “YidingNumber”, then 5n+13, 13n+5, 5n−13, 13n−5 are also “YidingNumbers”.
Now, given a positive integer n, please determine it is a “Yiding Number” or not.
Input
There is an integer T in the first line, indicating that there are T test cases;
For the next T lines, each line contains a positive integer n(n<=1000000).
Output
For each test cases, output “Yes” if n is a “YidingNumber”, otherwise output “No”.
Sample Input
2
18
100
Sample Output
Yes
No
Source
"红旗杯"第十四届东北地区大学生程序设计竞赛
解题思路
总体的思路就是倒推出1就是yd数,用的是递归的方法。
AC
#include<iostream>
using namespace std;
bool calculate(int n) {
if (n == 1)return true;
bool f1 = false, f2 = false, f3 = false, f4 = false;
if ((n - 13) % 5 == 0 && n > 13) {
f1 = calculate((n - 13) / 5);
}
if ((n + 13) % 5 == 0 && n > -13) {
f2 = calculate((n + 13) / 5);
}
if ((n + 5) % 13 == 0 && n > -5) {
f3 = calculate((n + 5) / 13);
}
if ((n - 5) % 13 == 0 && n > 5) {
f4 = calculate((n - 5) / 13);
}
return f1 || f2 || f3 || f4;//只要有一种运算方式能够最后算出1即为yd
}
int main()
{
int l, n;
while (cin >> l) {
while (l--) {
cin >> n;
if (calculate(n) == true)cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}