UVa 550 - Multiplying by Rotation N进制

自己推了个公式,然后枚举实现,结果TLE

  参考了人家代码,即使人家附了思路,还理解了半天。。惭愧。。。

 

“输入k,m,n,本来的数字为s,因为s的最后一位为m,则s*n的最后一位为s*n%k,而s*n%k又是s的倒数第二位,如许又可以策画出ans*n的倒数第二位”

#include <cstdio>
int main()
{
    int k, m, n;
    while(scanf("%d%d%d", &k, &m, &n) != EOF)  {
        int cnt = 1;
        int s = m * n;                        
        while(s != m)  {                    // 如果s >= k 说明还能进位,必然不可能等于m.   注意下面的 s % k * n 不能是 s * n % k .  这个理解了好久。 因为所要计算的是倒数第二位!
            s = s % k * n + s / k;       // 这里的 s / k 就是进位, k进制, 这个可以自己算下,比如十进制值为 9 的四进制数   9 / 4 = 2 , 即进位+2 留下 9 % 4 = 1  即 21(base 4). 
            cnt ++;
        }
        printf("%d\n", cnt);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值