解题思路

这是一个进制转换和分数计算问题。关键点:

  1. 进制转换

    • 对于每个进制 (2到 )
    • 转换为 进制
    • 计算各位数字之和
  2. 分数化简

    • 总和除以进制个数得到平均值
    • 需要化简为最简分数
  3. 最大公约数

    • 使用辗转相除法求GCD
    • 用于分数化简

代码

#include <iostream>
using namespace std;

// 计算最大公约数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 计算一个数在指定进制下各位数字之和
int getSum(int num, int base) {
    int sum = 0;
    while(num > 0) {
        sum += num % base;
        num /= base;
    }
    return sum;
}

void solve(int A) {
    if(A <= 2) {
        cout << "0/1" << endl;
        return;
    }
    
    // 计算2到A-1进制下的各位数字之和
    int sum = 0;
    int count = A - 2;  // 进制个数
    
    for(int base = 2; base < A; base++) {
        sum += getSum(A, base);
    }
    
    // 化简分数
    int g = gcd(sum, count);
    cout << sum/g << "/" << count/g << endl;
}

int main() {
    int A;
    while(cin >> A) {
        solve(A);
    }
    return 0;
}
import java.util.*;

public class Main {
    // 计算最大公约数
    static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
    
    // 计算一个数在指定进制下各位数字之和
    static int getSum(int num, int base) {
        int sum = 0;
        while(num > 0) {
            sum += num % base;
            num /= base;
        }
        return sum;
    }
    
    static void solve(int A) {
        if(A <= 2) {
            System.out.println("0/1");
            return;
        }
        
        // 计算2到A-1进制下的各位数字之和
        int sum = 0;
        int count = A - 2;  // 进制个数
        
        for(int base = 2; base < A; base++) {
            sum += getSum(A, base);
        }
        
        // 化简分数
        int g = gcd(sum, count);
        System.out.println(sum/g + "/" + count/g);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            int A = sc.nextInt();
            solve(A);
        }
    }
}
# -*- coding:utf-8 -*-

def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)

def get_sum(num, base):
    sum = 0
    while num > 0:
        sum += num % base
        num //= base
    return sum

def solve(A):
    if A <= 2:
        print("0/1")
        return
    
    # Calculate sum of digits in bases from 2 to A-1
    sum = 0
    count = A - 2  # number of bases
    
    for base in range(2, A):
        sum += get_sum(A, base)
    
    # Simplify fraction
    g = gcd(sum, count)
    print(f"{sum//g}/{count//g}")

while True:
    try:
        A = int(input())
        solve(A)
    except:
        break

算法及复杂度

  • 算法:进制转换 + 分数化简
  • 时间复杂度:,每个进制下的转换需要 次操作
  • 空间复杂度:,只使用常数额外空间