完全数:它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
性质:
1.完全数都能写成连续自然数之和
2.每个完全数的全部因数倒数之和都是2
3.除了6以外的完全数,每个都可以表示成连续奇数的立方和
4.每个完全数都可以表达成2的一些连续正整数次幂之和
5.完全数都是以6或者8结尾
6.位数字相加知道变成个位数,这个个位数一定是1.
首十个完全数是):
6(1位)
28(2位)
496(3位)
8128(4位)
33550336(8位)
8589869056(10位)
137438691328(12位)
2305843008139952128(19位)
2658455991569831744654692615953842176(37位)
191561942608236107294793378084303638130997321548169216(54位)
题目1:求m到n范围内的完全数。(1<=m<=n<=99 999 999)
ac代码:
#include<iostream>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int main(){
ll p[8]={6,28,496,8128,33550336,8589869056,137438691328};
ll m,n;
while(cin>>m>>n){
bool flag=0;
for(int i=0;i<7;i++){
if(p[i]>=m&&p[i]<=n){
flag=1;
break;
}
}
if(!flag){
cout<<"NO!"<<endl;
continue;
}
for(int i=0;i<7;i++){
if(p[i]>=m&&p[i]<=n){
cout<<" "<<p[i];
}
}
cout<<endl;
}
return 0;
}
题目二: ecnu 1197
题目大意:求一个数是盈数还是亏数还是完美数。
直接利用因子和公式。
#include<iostream>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int main(){
ll n;
while(cin>>n&&n){
ll m=n,s=1;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ll a=1;
while(n%i==0){
n/=i;
a*=i;
}
s=s*(a*i-1)/(i-1);
if(s>2*m)
break;
}
}
if(s>2*m)
{
cout<<"1"<<endl;
continue;
}
if(n>1){
s=s*(n+1);
}
s-=m;
if(s>m){
cout<<"1"<<endl;
}
else if(s==m){
cout<<"0"<<endl;
}
else if(s<m){
cout<<"-1"<<endl;
}
}
return 0;
}