题解 CF13A 【Numbers】

博客介绍了如何解决竞赛编程题CF13A,重点在于进制转换和计算最大公约数(GCD)。通过数学的短除法实现进制转换,使用递归或模板实现GCD的计算。提供的代码中运用了函数提前声明,虽然码风可能不美观,但功能完整。

这题其实不太难,明明就是一道红题。
对于这道题,我们需要定义俩函数,一个用来转换进制,一个用来求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;  //返回数字和
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值