HDOJ--1719--Friend

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.
 

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值