C++复习(十二)——完全数&亲密数&自守数&回文数

 

题目二十三:求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(乔金明),谢谢,也可以相互交流下,备注信息随意,只要能看得出是开发者或者学习者即可。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值