题解 CF13A 【Numbers】

这题其实不太难,明明就是一道红题。
对于这道题,我们需要定义俩函数,一个用来转换进制,一个用来求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;  //返回数字和
}
发布了9 篇原创文章 · 获赞 1 · 访问量 511

猜你喜欢

转载自blog.csdn.net/live_now/article/details/105025097