uva 550 - Multiplying by Rotation

21 篇文章 0 订阅
8 篇文章 0 订阅

题意:给一个进制数   最后一位数   和  乘数      要求求出最小的位数    满足   最后一位数变成第一位   其余的数不变  位置可以变  

下面是copy 别人的分析:

这个题一开始没看懂什么意思,所以就放在那没做,还是今天pengnix跟我说了这个题,才开始做的。
题目就是给出三个数,jinzhi,lastnumber,chengshu.求出在jinzhi进制下最少几位数a使得a*chengshu的值最后一位变成最前一位,其他不变。为了说明问题,还是拿题目说明测试数据来说吧。
179487 * 4 = 717948(10进制)
4*7=28     28!=7    28/10=2    28=8;
4*8+2=34    34!=7    37/10=3    34=4;
4*4+3=19    19!=7    19/10=1    19=9;
4*9+1=37    37!=7    37/10=3    37=7;
4*7+3=31    31!=7    31/10=3    31=1;
4*1+3=7      7==7;(end)


为什么可以这样做呢     我们可以观察到   前一个数的余数一定是下一个数的乘数    这样算下来就满足    最后一位数变成第一位   其余的数不变的条件了 

#include<cstdio>

int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    int b,last,f;
    while(scanf("%d%d%d",&b,&last,&f) !=EOF)
    {
        int i,cnt,N;
        N = last;
        i = cnt = 0;
        while(1)
        {
            if(last*f+i == N)
            {
                cnt++;
                break;
            }
            cnt++;
            last = last*f+i;
            i = last/b;
            last = last % b;
        }
        printf("%d\n",cnt);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值