题目二十三:求1000以内所有的完全数,完全数的特征是该数的所有因子等于该数本身,例如6=1+2+3
题目二十四:求3000以内全部的亲密数, 若a的全部因子之和等于b,b的全部因子之和等于a,则a,b为亲密数
题目二十五:求200000以内的自守数,自守数指这个数的平方的尾数等于该数
题目二十六:找出所有小于256的回文数,回文数是指 该数的平方为对称数
/*
题目二十三:求1000以内所有的完全数,完全数的特征是该数的所有因子等于该数本身,例如6=1+2+3
分析:使用逐步试探的方式即可
题目二十四:求3000以内全部的亲密数, 若a的全部因子之和等于b,b的全部因子之和等于a,则a,b为亲密数
分析:可采用试探的方式,但是需要进行3000*3000次计算,非常耗时
所以可以采用数组的形式
题目二十五:求200000以内的自守数,自守数指这个数的平方的尾数等于该数
分析:20万的平方已经超出了表示范围,所以可以采用只计算尾数的方式,
之前也有做过类似的尾数求解题目 ,这个题目是到目前为止比较难处理的,我已经将分步
函数全部给出
题目二十六: 找出所有小于256的回文数,回文数是指 该数的平方为对称数
分析:之前有做过类似题目,比较简单,不多做概述
*/
#include<iostream>
using namespace std;
int wan_quan(int n){
int i,total = 0;
for (i=1;i<n;i++){
if(n%i == 0)total += i;
}
if(total == n){
return 1;
}else{
return 0;
}
}
int qin_mi(int a,int b){
int i,j,total_a = 0,total_b = 0;
for (i=1;i<a;i++){
if(a%i == 0)total_a += i;
}
for (j=1;j<b;j++){
if(b%j == 0)total_b += j;
}
if(total_a == b&&total_b == a){
return 1;
}else{
return 0;
}
}
int yin_zi(int n){
int i,total = 0;
for (i=1;i<n;i++){
if(n%i == 0)total += i;
}
return total;
}
int get_last_bit(int n,int i){//返回数字n的后i位
int total=0,j,now=1,k;
for(j = 1;j<=i;j++){
for(k=1;k<j;k++){
now *= 10;
}
total += n%10*now;
n /= 10;
now = 1;
}
return total;
}
int number(int num,int n){//返回第n位的数字
int i = n;
int fin;
for(;i>1;i--){
num /= 10;
}
fin = num%10;
//cout<<fin<<endl;
return fin;
}
int yes_bit(int n){//判断位数
int count=0;
for(;n!=0;n /= 10){
count++;
}
return count;
}
int zi_shou(int n){
int count=0,num,total = 0,i,k,now=1;
if(n == 0){
return 1;
}
for(num = n;num != 0;num/=10){
count++;
}
//cout<<count<<endl;
num = n;
for(i = 1;i <= count;i++){
for(k=1;k<i;k++){
now *= 10;
}
total += get_last_bit(num*number(num,i),count-i+1)*now;
now = 1;
//if(yes_bit(total)==count+1)break;
}
if(num == get_last_bit(total,count)){
return 1;
}else{
return 0;
}
}
int hui_wen(int n){
int num = n,count=0;
for(;num != 0 ;num/=10){
count++;
}
num = n;
int a[100],i;
for(i = 0;i<count;i++){
a[i] = num%10;
num /= 10;
}
for(i=0;i<count;i++){
if(a[i]!=a[count-1-i])return 0;
}
return 1;
}
int main(){
//题目二十三:
/*
int i;
for(i = 1;i<=1000;i++){
if(wan_quan(i))cout<<i<<endl;
}
*/
//题目二十四
//运行了七十多秒。。。
/*
int i,j;
for(i = 1;i<=3000;i++) {
for(j = 1;j<=3000;j++){
if(i >= j)continue;
if(qin_mi(i,j))cout<<i<<" and "<<j<<endl;
}
}
*/
//方法二
//速度得到平方次提升
/*
int a[5000];
int i,j;
for(i = 0;i<3000;i++){
a[i] = yin_zi(i+1);
}
for(i=0;i<3000;i++){
for(j=i+1;j<3000;j++){
if(a[i]==j+1&&a[j]==i+1)cout<<i+1<<" and "<<j+1<<endl;
}
}
*/
//题目二十五
/*
int i;
for(i = 0;i<=200000;i++){
if(zi_shou(i))cout<<i<<endl;
}
*/
//题目二十六
int i;
for(i = 1;i<256;i++){
if(hui_wen(i*i))cout<<i<<endl;
}
return 0;
}
这其中有不合适或者不正确的地方欢迎指正,我的QQ号码:2867221444(乔金明),谢谢,也可以相互交流下,备注信息随意,只要能看得出是开发者或者学习者即可。