这题其实不太难,明明就是一道红题。
对于这道题,我们需要定义俩函数,一个用来转换进制,一个用来求gcd,转换进制的方法运用到了数学上的短除法,边%边/。gcd用递归写,模板背都能背下来了,也不必说了。
下面上代码(这里用到了函数的提前声明,码风较丑,不喜勿喷):
#include <stdio.h>
using namespace std; //加上这句话表示我仍心系C++
int gcd(int,int), jz(int,int); //提前声明函数,便于调用
int main ()
{
int n, s=0, x; //定义变量
scanf("%d",&n); //C语言读入
for(int i=2;i<n;i++) s+=jz(n,i); //累加一下
x=n-2; //从2到n-1只有n-2个数
int z=gcd(s,x); //取最大公约数
s/=z; //约分
x/=z; //约分
printf("%d/%d",s,x); //C语言输出
return 0; //警告!!!程序并没有完全结束
} //最后写函数
int gcd(int x,int y) //求最大公约数的函数
{
if(y==0) return x;
return gcd(y,x%y);
}
int jz(int k,int p)
{
int sum=0;
while (k){
sum+=k%p; //短除法
k/=p; //消去最后一位
}
return sum; //返回数字和
}