0
点赞
收藏
分享

微信扫一扫

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



举报

相关推荐

0 条评论