HDU 1406 完数(枚举+打表)

完数

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

Problem Description
完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。

本题的任务是判断两个正整数之间完数的个数。
 
Input
输入数据包含多行,第一行是一个正整数n,表示测试实例的个数,然后就是n个测试实例,每个实例占一行,由两个正整数num1和num2组成,(1<num1,num2<10000) 。

Output
对于每组测试数据,请输出num1和num2之间(包括num1和num2)存在的完数个数。
 
Sample Input
   
   
   
   
2 2 5 5 7

Sample Output
   
   
   
   
0 1

Author
lcy

Source
杭电ACM集训队训练赛(IV)
 
题解:打表
AC代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<algorithm>
#include<time.h>
typedef long long LL;
using namespace std;
bool Wan_shu(int n){
	int sum = 1;
	for (int i = 2; i < n; i++){
		if (n%i == 0){
			sum += i;
		}
	}
	if (sum == n) return 1;
	else return 0;
}

int main(){
	
	int ws[10000] = { 0 };         
	for (int i = 0; i < 10000; i++){        //打表 
		if (Wan_shu(i)){
			ws[i] = 1;
		}
	}
	int T;
	cin >> T;
	while (T--){
		int a, b;
		int count = 0;
		cin >> a >> b;
		if (a > b){
			swap(a,b); 
		}
		for (int i = a; i <= b; i++){
			count += ws[i];
		}
		cout << count << endl;
	}
	return 0;
}


你可能感兴趣的:(HDU,完数,1406,枚举+打表)