HDU 1719friend

Friend number are defined recursively as follows.
(1) numbers 1 and 2 are friend number;
(2) if a and b are friend numbers, so is ab+a+b;
(3) only the numbers defined in (1) and (2) are friend number.
Now your task is to judge whether an integer is a friend number.
其实该题主x要描述了:
          (1).1和2是朋友数。(2).如果a和b是朋友数,那么a+b+ab也是朋友数。3.X当且仅当满足(1)或(2)的情形才能判定X是朋友数。(0<=X<=2^30)
这题纯属就是一个规律题。假如给你个数X,你怎么判断。你肯定会先看它是不是1或2或者1+2*2+2*1.
也既是判断X =? a+b+ab
变形可得到X+1 =? (a+1)(b+1)
但是一开始只有1和2是朋友数。故可以得到一个规律:只需判断X+1是否能表示成2^x*3^y的形式即可。(x和y不全为0
下面给出代码:
friend
 1 #include<iostream>
2 using namespace std;
3
4 int main(void)
5 {
6 __int32 n;
7 while (scanf("%I32d",&n) != EOF)
8 {
9 if (n == 0)
10 {
11 printf("NO!\n");
12 }
13 else
14 {
15 ++n;
16 while (n % 2 == 0 || n % 3 == 0)
17 {
18 if (n % 2 == 0)n /= 2;
19 if (n % 3 == 0)n /= 3;
20 }
21 if (n != 1)
22 {
23 printf("NO!\n");
24 }
25 else
26 {
27 printf("YES!\n");
28 }
29 }
30 }
31 return 0;
32 }

  

posted on 2011-08-25 12:51  Dev-T  阅读(410)  评论(0编辑  收藏  举报