题目描述:
求用十进制、二进制、八进制表示都是回文数的所有数字中,大于十进制数10的最小值。
解题思路:
从 i = 10开始遍历, 对十进制数转换成八进制和二进制, 对十进制数、八进制数、二进制数分别进行回文数判断。
代码:
1、十进制数转n 进制数函数中用到的前置函数
//计算num的 n 次方的函数;
int Mypower0(int num,int n){
if(n==0){
return 1;
}
int temp = num;
for(int i =0;i<n-1;i++){
num*=temp;
//cout<<"num = "<<num<<endl;
}
return num;
}
//计算 num * 10 的 n 次方;
int Mypower1(int num,int n){
int res = 0;
res += num *Mypower0(10,n);
return res;
}
2、十进制转n进制函数
int convert(int num,int bit){
int temp;
int cnt = 0;
int res = 0;
int remainder;
while(num){
temp = num/bit;
remainder = num%bit;
//cout<<"remainder = "<<remainder<<"bit = "<<bit<<endl;
//每除一次的余数乘 bit 的次数从 0 递增
res += Mypower1(remainder,cnt);
cnt++;
num/=bit;
}
return res;
}
3、判断数字是不是回文数的函数
bool isPalindrome0(int num){
int jg = 0;
int temp = num;
while(num){
jg = jg*10 + num%10;
num/=10;
// cout<<"jg = "<<jg<<endl;
// cout<<"num = "<<num<<endl;
}
return jg == temp;
}
4、主程序思路
int main (){
int flag = 1;
for(int i = 11;flag;i++){
int flag_2 = isPalindrome0(convert(i,2));//判断该数转换成二进制是否是回文数
int flag_8 = isPalindrome0(convert(i,8));//判断该数转化成八进制是否是回文数
int flag_10 = isPalindrome0(i);//判断该数十进制形式时是否是回文数
if(flag_2&&flag_8&&flag_10){
flag = 0;
cout<<i<<endl;
break;
}
}
//cout<<isPalindrome0(585)<<endl;
return 0;
}
今早上只研究了这个题,想把它写完美一点,可读性高一点,而且其中用到的方法和对于回文数以及进制转换算法是很久没写了不太熟悉了罢了,数学思路还是很简单的。