题目:
一个自然数的七进制表达式是一个3位数,而这个自然数的九进制表达式也是一个3位数,且这2个3位数的数码顺序正好相反,求这个自然数。
解题思路:
该题考察的是我们的进制转换,而不同类型中的进制转换纯粹是数学上的计算。只要在数学上理解了,写出进制转换的代码轻而易举。
所以我们直接从数学上分析:
以10进制的101,转7进制为例
10进制的10展开来看,从低位到高位其实是:C语言解题 || 考研100种经典题型-数据类型-进制转换
数学上我们已经理解了,现在我们来写代码。
代码实现:
我们这里给出了2种代码实现方式,更推荐第一种。
1.
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int n = 0;
int k = 0;
int arr_7[3] = { 0 };//记录7进制数
int arr_9[3] = { 0 };//记录9进制数
int small = pow(7, 2);//这个数的最小值
int max = 6 * pow(7, 0) + 6 * pow(7, 1) + 6 * pow(7, 2);//这个数的最大值
for (i = small; i <= max; i++)
{
//转为7进制
//反着转 -> 数列是倒着的
for (n = i, k = 0; n > 0; n /= 7)
{
arr_7[k] = n % 7;
k++;
}
//转为9进制
//正着转 -> 数列是正常的
for (n = i, k = 2; n > 0; n /= 9)
{
arr_9[k] = n % 9;
k--;
}
//逐位(数字位,不是bit)判断
for (k = 0; k < 3; k++)
{
if (arr_7[k] != arr_9[k])
{
break;
}
}
//k == 3, 表示每一位都相同
if (k == 3)
{
printf("%d\n", i);
break;
}
}
return 0;
}
2.
#include <stdio.h>
#include <math.h>
char* Base7(int x)//将十进制转化为七进制, 反着写
{
char* p = "0123456\0";
char arr[4] = { 0 };//3位数,最后一个位置放'\0'
int i = 0;
int n = 0;//传出去的值
while (1)
{
arr[i] = x % 7 + '0';
i++;
x /= 7;
if (x / 7 == 0)
{
arr[i] = x % 7 + '0';
break;
}
}
//传成int类型传出去
for (i = 0; arr[i]; i++)
{
n += (arr[i] - '0') * (int)pow(10, i);
}
return n;
}
int Base9(int x)//将十进制转化为九进制, 正着写
{
char* p = "0123456789\0";
char arr[4] = { 0 };
int i = 0;
int n = 0;//传出去的值
int count = 0;
char* left = arr;
char* right = NULL;
while (1)
{
arr[i] = x % 9 + '0';
i++;
x /= 9;
if (x / 9 == 0)
{
arr[i] = x % 9 + '0';
break;
}
}
//将字符串变为正序
for (count = 0; arr[count]; count++)
{
;
}
right = arr + count - 1;
while (left < right)
{
*left ^= *right;
*right ^= *left;
*left ^= *right;
left++;
right--;
}
//传成int类型传出去
for (i = 0; arr[i]; i++)
{
n += (arr[i] - '0') * pow(10, i);
}
return n;
}
int main()
{
int i = 0;
int small = pow(7, 2);//这个数的最小值
int max = 6 * pow(7, 0) + 6 * pow(7, 1) + 6 * pow(7, 2);//这个数的最大值
for(i = small; i <= max; i++)
{
if (Base7(i) == Base9(i))
{
printf("%d\n", i);
break;
}
}
return 0;
}