【题目链接】
【题目考点】
1. 数制
2. 枚举
【解题思路及题解代码】
解法1:
已知某十进制数字在七进制和九进制下是数字顺序相反的三位数字。
- 设该三位数字在7进制下是abc,在9进制下是cba,其中第3位是a,第2位是b,第1位是c,其中0<= a, b, c <=9
这两个数字的值是相等的,根据数制的知识,将这两个数字按位权展开,并用等号连接,有:
a ∗ 7 2 + b ∗ 7 + c = c ∗ 9 2 + b ∗ 9 + a a*7^2 + b*7 + c = c*9^2 + b*9 + a a∗72+b∗7+c=c∗92+b∗9+a
整理得:
48 a − 2 b − 80 c = 0 48a - 2b -80c = 0 48a−2b−80c=0 - 查看a,b,c的取值范围
a是abc的第一位数字,c是cba的第一位数字,都不能为0
abc是七进制数字,每一位的数码只能是0~6中的一个。
暴力搜索a,b,c的所有可能取值,即可搜索到满足条件的a,b,c
而后可以求得:
十进制数字: a ∗ 7 2 + b ∗ 7 + c a*7^2 + b*7 + c a∗72+b∗7+c
七进制数字:abc
九进制数字:cba
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c;
for(a = 1; a <= 6; ++a)
for(b = 0; b <= 6; ++b)
for(c = 1; c <= 6; ++c)
{
if(48 * a - 2 * b - 80 * c == 0)
{
cout<<a * 49 + b * 7 + c<<endl;//十进制数字
cout<<a<<b<<c<<endl;//七进制数字
cout<<c<<b<<a<<endl;//九进制数字
return 0;
}
}
return 0;
}
解法2:
九进制三位数最小值为
(
100
)
9
=
(
81
)
10
(100)_9 = (81)_{10}
(100)9=(81)10,七进制三位数最大值为
(
666
)
7
=
(
342
)
10
(666)_7 = (342)_{10}
(666)7=(342)10
十进制下81~342的数字无论转化成七进制还是九进制都是三位数。
遍历81到342的所有十进制数字,求出其对应的七进制和九进制数字的字符串,判断这两个字符串是否是顺序相反的。如果找到满足条件的数字,那么就输出结果。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n7[5],n9[5];//分别存储7进制数字和9进制数字,从低位到高位存储,n[0]存储个位,n[1]存储十位,n[2]存储百位
for(int i = 81; i <= 342; ++i)//i:待查看的十进制数字
{
int i7 = 0, i9 = 0;//两个数组的下标,指向待存储数字的位置。
for(int a = i; a > 0; a /= 7)//分离7进制下的各个数位,存入n7
n7[i7++] = a % 7;
for(int a = i; a > 0; a /= 9)//分离9进制下的各个数位,存入n9
n9[i9++] = a % 9;
if(n7[0] == n9[2] && n7[1] == n9[1] && n7[2] == n9[0])//判断两个三位数是否是反序的
{
cout<<i<<endl;//十进制数
cout<<n7[2]<<n7[1]<<n7[0]<<endl;//七进制数
cout<<n9[2]<<n9[1]<<n9[0]<<endl;//九进制数
return 0;
}
}
return 0;
}