HDU - 1406 完数(完全数)

来源:互联网 发布:业绩数据分析内容 编辑:程序博客网 时间:2024/04/28 20:38

题目:

完数的定义:如果一个大于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
22 55 7
Sample Output
01

数学里面,一般都是叫完全数

偶完全数很好求,因为欧拉求出了所有的偶完全数,它们有共同的表达式:

t*(t-1)/2

其中t=2^p,满足p为素数且t-1为素数

这样,我们可以轻松求出,10000以内只有4个完全数:4,28,496,8128

这个时候,再用从num1到num2的循环就不合适了,最好是用常数时间的算法

有个地方需要注意,num1和num2的大小关系未知

代码:

#include<iostream>using namespace std;int main(){int a, b;cin >> a;while (cin >> a >> b)cout << ((a - 6)*(b - 6) <= 0) + ((a - 28)*(b - 28) <= 0) + ((a - 496)*(b - 496) <= 0) + ((a - 8128)*(b - 8128) <= 0) << endl;return 0;}
这个代码,自然是0ms AC了

因为写的时候a和b是对称的,所以不需要额外判断a和b的大小

1 0
原创粉丝点击