1. 问题描述:
给定一个大于 2 的十进制正整数 A。该数字在 2∼A−1 进制表示下的各位数字之和均可以求出。例如,数字 123 在 16 进制表示下,共有 2 位:第 1 位是 7,第二位是 11,各位数字之和为 18。现在,请你将 A 在 2∼A−1 进制表示下的各位数字之和全部相加,并将得到的结果除以 A−2,最终结果以最简分数形式输出。
输入格式
一个十进制正整数 A。
输出格式
输出格式为 X/Y,其中 X 表示输出答案的分子,Y 表示输出答案的分母。
数据范围
前三个测试点满足 3 ≤ A ≤ 10。
所有测试点满足 3 ≤ A ≤ 1000。
输入样例1:
5
输出样例1:
7/3
输入样例2:
3
输出样例2:
2/1
来源:https://www.acwing.com/problem/content/description/4213/
2. 思路分析:
分析题目可以知道我们需要求解A在某一个进制下的各位数字之和,十进制转为其他进制求解各位数字之和可以使用辗转相除法求解,我们可以枚举进制2~A-1,使用一个方法计算出当前的数字A在base进制下各位数字之和即可,因为数据规模不大所以是可以通过的。
3. 代码如下:
class Solution:
# 计算A在base进制下各个位上的数字之和
def get(self, base, A: int):
res = 0
while A > 0:
res += A % base
A //= base
return res
# 求解最大公约数
def gcd(self, a: int, b: int):
return a if b == 0 else self.gcd(b, a % b)
def process(self):
A = int(input())
# 计算2~A-1进制下各位数字之和
res = 0
for i in range(2, A):
res += self.get(i, A)
# 因为需要最简分数输出所以需要求解最大公约数
x, y = res, A - 2
g = self.gcd(x, y)
x //= g
y //= g
return "{:}{:}{:}".format(x, "/", y)
if __name__ == '__main__':
print(Solution().process())