OpenJudge NOI 1.5 25:求特殊自然数

【题目链接】

OpenJudge NOI 1.5 25:求特殊自然数

【题目考点】

1. 数制
2. 枚举

【解题思路及题解代码】

解法1:

已知某十进制数字在七进制和九进制下是数字顺序相反的三位数字。

  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 a72+b7+c=c92+b9+a
    整理得:
    48 a − 2 b − 80 c = 0 48a - 2b -80c = 0 48a2b80c=0
  2. 查看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 a72+b7+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;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值