解题思路
这是一个进制转换和分数计算问题。关键点:
-
进制转换:
- 对于每个进制 (2到 )
- 将 转换为 进制
- 计算各位数字之和
-
分数化简:
- 总和除以进制个数得到平均值
- 需要化简为最简分数
-
最大公约数:
- 使用辗转相除法求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
算法及复杂度
- 算法:进制转换 + 分数化简
- 时间复杂度:,每个进制下的转换需要 次操作
- 空间复杂度:,只使用常数额外空间