题意:
已知1,2是friend number,另外如果a和b是friend number,那么a*b+a+b是friend number。给一个数n,让你判断该数是否为friend number。
思路:
化简a*b+a+b = (a+1)*(b+1)-1;
所以对于一个数,其必然是(x+1)*(y+1)-1的形式,然后又能化成(x1+1)*(y1+1)*(y+1)-1的形式,所以对于一个数,它肯定能化到不能再化的时刻,即所有的未知数要么是1要么是2的时刻。所以判断一个数是否为friend number,就是判断其是否是2^x * 3^y - 1的形式,即+1之后是否只含有2和3两个质因子。
特判n == 0时不是friend number。
代码:
#include <bits/stdc++.h>
using namespace std;
bool jg(int n)
{
if(n == 1) return 0;
while(n%2 == 0) n /= 2;
while(n%3 == 0) n /= 3;
return n == 1;
}
int main()
{
int n;
while(cin >> n)
{
if(jg(n+1)) cout << "YES!" << endl;
else cout << "NO!" << endl;
}
return 0;
}
继续加油~