C++复习(十一)——特定数字求解

 

问题十九:一个四位数的9倍刚好是其反序数,求该四位数

问题二十:初始值为95859,为对称数,即前后反序数字不变,增加某个数字的二倍后,得到一个新的对称数,求新的对称数

问题二十一:两个平方三位数abc和xyz,所构成的ax,by,cz是三个平方两位数,求符合情况的所有两个三位数

问题二十二:求1000以内的所有阿姆斯特朗数,数的特征是所有位上的数字的立方的和等于这个数本身,且为正整数 

/*
题目十九:一个四位数的9倍刚好是其反序数,求该四位数

分析:比之前的题目简单,这里给出代码,这个四位数不会超过 1200,
否则九倍后就超出了范围


题目二十: 初始值为95859,为对称数,即前后反序数字不变,增加某个数字的二倍后,得到一个新的对称数,求新的对称数

分析:依旧采用试探法,可以将“某个数的二倍”视为一个数 ,即为求下一个反序数 
下一个数不会超过100000 


题目二十一:两个平方三位数abc和xyz,所构成的ax,by,cz是三个平方两位数,求符合情况的所有两个三位数 

分析: 可开平方的两位数00,04,09,16,25,36,49,81共八种 ,可由上两题的已知函数求解


题目二十二: 求1000以内的所有阿姆斯特朗数,数的特征是所有位上的数字的立方的和等于这个数本身,且为正整数 

分析: 例如407=4*4*4+0*0*0+7*7*7,则407就是一个阿姆斯特朗数,根据上面的已知函数可得 
*/
#include<iostream>
using namespace std;

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 test_up(int num){
	int mid = num;
	int i;
	for(i = 1;i<=5;i++){
		if(number(mid,i)!=number(mid,6-i))break;
	}
	if(i == 6){
		return 1;
	}else{
		return 0;
	}
} 

int test_bit(int num){//测试是否为平方数 
	int i;
	if(num/100>0){
		for(i = 10;i<32 && i*i<=num;i++){
			if(i*i == num){
				return 1;
			}
		}
	}else{
		for(i = 0;i<=9 && i*i<=num;i++){
			if(i*i == num){
				return 1;
			}
		}
	}
	return 0;
} 

int main(){
	//题目十九
	/* 
	int i;
	int mid,mid_ninth;
	for(i = 1000;i<=1200;i++){
		mid = i;
		mid_ninth = i*9;
		if(number(mid,1)==number(mid_ninth,4) &&
			number(mid,2)==number(mid_ninth,3) &&
			number(mid,3)==number(mid_ninth,2) &&
			number(mid,4)==number(mid_ninth,1))cout<<i<<endl; 
	}*/
	
	
	//题目二十
	/*
	int i;
	for(i=95860;i<100000;i++){
		if(test_up(i)){
			cout<<i<<endl;
			break;
		}
	} 
	*/
	
	
	//题目二十一
	/*	int i;
		while(1){
			cin>>i;
			cout<<test_bit(i);
		}*/
	/*
	int i,j;
	for(i=100;i<=999;i++){
		if(test_bit(i) == 0)continue;
		for(j=100;j<=999;j++){
			if(test_bit(j) == 0)continue;
			if(test_bit(number(i,3)*10+number(j,3)) &&
			test_bit(number(i,2)*10+number(j,2)) &&
			test_bit(number(i,1)*10+number(j,1))){
				cout<<i<<" and "<<j<<endl;
			}
		}
	} 
	*/
	
	
	//题目二十二
	int i;
	for(i=1;i<=1000;i++){
		if(i/10 == 0){
			if(i == i*i*i)cout<<i<<endl;
		}else{
			if(i/100 == 0){
				if(i == number(i,2)*number(i,2)*number(i,2)+
						number(i,1)*number(i,1)*number(i,1)){
							cout<<i<<endl;
				}
			}else{
				if(i == number(i,3)*number(i,3)*number(i,3)+
						number(i,2)*number(i,2)*number(i,2)+
						number(i,1)*number(i,1)*number(i,1)){
							cout<<i<<endl;
						}
			}
		}
	} 
	return 0;
}

       这其中有不合适或者不正确的地方欢迎指正,我的QQ号码:2867221444(乔金明),谢谢,也可以相互交流下,备注信息随意,只要能看得出是开发者或者学习者即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值