不可摸数(HDU1999)

不可摸数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6240    Accepted Submission(s): 1619


Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
 

Input
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。
 

Output
如果n是不可摸数,输出yes,否则输出no
 
Sample Input
    
    
3 2 5 8
 

Sample Output
    
    
yes yes no


解题思路:暴力破解,先打表,再标记;
打表:
int i , j , sum ,count = 0 ;
	memset(a , 0 , sizeof(a));
	for(i = 1; i <= 500000 ; i++)
	{
		sum = 0 ;
		for(j = 1 ; j < i ; j++)
		{
			if((i % j) == 0)
			sum += j;
			if(sum > 1000)
			j = i;
		}
		if(sum >= 2 && sum <= 1000)
		{
			if(a[sum] != 1)
			{
				a[sum] = 1;
				count ++;
			}
	    }
	}
	cout << count << endl;//在1000以内,总共有887个是可摸数;
	for(i = 2; i <= 1000 ; i++)//打表;
	{
		if(a[i] != 1)
		{
			cout << i <<" , ";
			count++;
			if(count % 8 == 0)
			cout << endl;
		}
	}
在1000以内不可摸数:
2 ,5 , 52 , 88 , 96 , 120 , 124 , 146 , 162 ,
188 , 206 , 210 , 216 , 238 , 246 , 248 , 262 ,
268 , 276 , 288 , 290 , 292 , 304 , 306 , 322 ,
324 , 326 , 336 , 342 , 372 , 406 , 408 , 426 ,
430 , 448 , 472 , 474 , 498 , 516 , 518 , 520 ,
530 , 540 , 552 , 556 , 562 , 576 , 584 , 612 ,
624 , 626 , 628 , 658 , 668 , 670 , 708 , 710 ,
714 , 718 , 720 , 726 , 728 , 732 , 738 , 748 ,
750 , 752 , 756 , 758 , 762 , 766 , 768 , 770 ,
782 , 784 , 788 , 792 , 802 , 804 , 818 , 822 ,
828 , 836 , 840 , 848 , 852 , 864 , 872 , 882 ,
892 , 894 , 896 , 898 , 902 , 908 , 912 , 920 ,
926 , 930 , 934 , 936 , 938 , 948 , 964 , 966 ,
968 , 976 , 982 , 984 , 992 , 996 , 998 
#include <iostream>
#include <cstring>
using namespace std;

int b[1001];
int main()
{
	int a[115]={2 ,
5 , 52 , 88 , 96 , 120 , 124 , 146 , 162 ,
188 , 206 , 210 , 216 , 238 , 246 , 248 , 262 ,
268 , 276 , 288 , 290 , 292 , 304 , 306 , 322 ,
324 , 326 , 336 , 342 , 372 , 406 , 408 , 426 ,
430 , 448 , 472 , 474 , 498 , 516 , 518 , 520 ,
530 , 540 , 552 , 556 , 562 , 576 , 584 , 612 ,
624 , 626 , 628 , 658 , 668 , 670 , 708 , 710 ,
714 , 718 , 720 , 726 , 728 , 732 , 738 , 748 ,
750 , 752 , 756 , 758 , 762 , 766 , 768 , 770 ,
782 , 784 , 788 , 792 , 802 , 804 , 818 , 822 ,
828 , 836 , 840 , 848 , 852 , 864 , 872 , 882 ,
892 , 894 , 896 , 898 , 902 , 908 , 912 , 920 ,
926 , 930 , 934 , 936 , 938 , 948 , 964 , 966 ,
968 , 976 , 982 , 984 , 992 , 996 , 998 
};
int i;
	memset(b, 0 , sizeof(b));
	for(i = 0 ; i < 114 ; i++)//是不可摸数,标记;
	b[a[i]] = 1;
	int T;
	while(cin >> T)
	{
		while(T--)
		{
			int n;
			cin >> n;
			if(b[n] == 1)
			cout <<"yes" << endl;
			else
			cout <<"no" << endl;
		}
		return 0;
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值