题目:

一个自然数的七进制表达式是一个3位数,而这个自然数的九进制表达式也是一个3位数,且这2个3位数的数码顺序正好相反,求这个自然数。

解题思路:

该题考察的是我们的进制转换,而不同类型中的进制转换纯粹是数学上的计算。只要在数学上理解了,写出进制转换的代码轻而易举。

所以我们直接从数学上分析:

以10进制的101,转7进制为例

10进制的10展开来看,从低位到高位其实是:C语言解题 || 考研100种经典题型-数据类型-进制转换_#include

它每一位的权重,是以10为底,以位次(从低位开始)为幂(幂从0开始,即第1位的幂是0,第2位的幂是1)。

用它转7进制只需要采用辗转相除法,不断地对100进行7的取模操作,求余数即可。如,

101 % 7  商14 余3

14 % 7  商2  余0

2 % 7 商 0 余2

最后的结果203,就是十进制101的七进制表达式。它展开为:C语言解题 || 考研100种经典题型-数据类型-进制转换_i++_02

数学上我们已经理解了,现在我们来写代码。

代码实现:

我们这里给出了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;
}

运行结果:

C语言解题 || 考研100种经典题型-数据类型-进制转换_进制_03