求特殊自然数

GitHub跳转原题关系图返回列表

枚举两种进制均为三位数的公共范围,比较七进制与反向九进制。

OJ: noi_openjudge

题目 ID: ch0105-25

难度:普及-

标签:枚举进制python

日期: 2026-07-30 23:01

题意

求一个自然数,使其七进制和九进制表示均为三位,且两种表示的数字顺序恰好相反。

思路

三位九进制数至少为 929^2,三位七进制数小于 737^3,只需枚举公共区间。to_base 用反复取余生成低位,再反转得到正常表示;比较 base7 == base9[::-1] 即可。

代码

Python代码

python
def to_base(number, base):
    digits = []
    while number:
        digits.append(str(number % base))
        number //= base
    return "".join(reversed(digits))


for number in range(9**2, 7**3):
    base7 = to_base(number, 7)
    base9 = to_base(number, 9)
    if len(base7) == len(base9) == 3 and base7 == base9[::-1]:
        print(number)
        print(base7)
        print(base9)
        break

C++代码

cpp
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char str_7[100];
char str_9[100];
int tran_to(int n,char a[],int base){
    int i,idx = 0;
    while( n != 0){
        int ret = n % base;
        a[idx++] = ret+'0';
        n = n / base;
    }
    for(i=0;i<idx/2;i++){
        swap(a[i],a[idx-i-1]);
    }
    return idx;
}

bool compare(){
    int i;
    for(i=0;i<3;i++){
        if( str_7[i] != str_9[2-i])
            return 0;
    }
    return 1;
}

int main(){
    int i;
    for(i=248;i<=999;i++){
        memset(str_7,0,sizeof(str_7));
        memset(str_9,0,sizeof(str_9));
        int len_7 = tran_to(i,str_7,7);
        if(len_7 != 3)
            continue;
        int len_9 = tran_to(i,str_9,9);
        if(len_9 != 3)
            continue;
        if( compare()){
            printf("%d\n",i);
            printf("%s\n",str_7);
            printf("%s",str_9);
            break;
        }
    }
    return 0;
}

复杂度

枚举范围固定,时间复杂度和额外空间复杂度均为 O(1)O(1)

总结

进制转换的基本过程是反复取余;从低位收集后反转即可恢复高位到低位顺序。