给定一个大于 2的十进制正整数 A
该数字在 2∼A−1 进制表示下的各位数字之和均可以求出。
例如,数字 123在 16 进制表示下,共有 2 位:第 1 位是 7,第2位是 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
关键点在于十进制转换成n进制、求最简分数
十进制转换n进制:
总结为“除N取余,逆序排列”
如图:
来自于:N进制与十进制之间的 转换(整数,小数) - 原则 - 博客园 (cnblogs.com)
当然本题只要求将位数相加,所以不必在乎顺序
求最简分数:
化简分数要找到最大公约数
可以使用短除法、辗转相除法
这里使用辗转相除法,也称欧几里得算法求解
详解见此博客
求GCD(最大公约数)的两种方式 - Seaway-Fu - 博客园 (cnblogs.com)
AC代码
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException
{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
int A=Integer.parseInt(reader.readLine());
int denominator=0;//分母
for(int i=2;i<=A-1;i++) denominator+=digitSum(A,i);
int gcf=gcd(denominator,A-2);
denominator/=gcf;
int molecule=(A-2)/gcf;//分子
System.out.print(denominator+"/"+molecule);
}
//短除法求取n进制各位数之和
public static int digitSum(int A,int r)
{
int result=0;
while(A!=0)
{
result+=A%r;
A/=r;
}
return result;
}
//辗转相除法求取最大公约数
public static int gcd(int a,int b)
{
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
}