Friend
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2193 Accepted Submission(s): 1096
Problem Description
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.
(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.
Input
There are several lines in input, each line has a nunnegative integer a, 0<=a<=2^30.
Output
For the number a on each line of the input, if a is a friend number, output “YES!”, otherwise output “NO!”.
Sample Input
3 13121 12131
Sample Output
YES! YES! NO!
思路:打表把所有的friend数储存起来,然后比较判断就可以了》
ac代码:
#include<stdio.h>
#include<math.h>
#define INF 0x3f3f3f3f
using namespace std;
int cop[1000100],t;
void excel(){
int i,j,k,cmp=pow(2,30);
cop[1]=1;
cop[2]=2;
t=2;
int temp;
for(i=1;i<=t;i++){
for(j=1;j<=i;j++){
temp=cop[i]*cop[j]+cop[i]+cop[j];
for(k=1;k<=t;k++)
if(temp==cop[k]){//如果说产生的friend数已经出现过就不必加入数组中。
temp=INF;
break;
}
if(temp>cmp)//如果产生的数大于cmp了 也没有必要加进去。循环到结束为止。
break;
if(temp!=INF){
t++;
cop[t]=temp;
}
}
}
}
int jud(int num){
for(int i=1;i<=t;i++)
if(cop[i]==num)
return 1;
return 0;
}
int main(){
excel();
int a;
while(scanf("%d",&a)!=EOF){
if(jud(a))
printf("YES!\n");
else
printf("NO!\n");
}
return 0;
}