UVA 550 - Multiplying by Rotation

探讨了在特定进制下,找到一个数N,使得N乘以常数c后的结果为N自身个位数移至首位的情况。通过迭代算法找出最小位数的N。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:输入k,w,c。在k进制下,一个以w为个位数的数N乘上c的结果,为将这个N的个位数移动到第一位。求这个N最少几位数。例如10 7 4, 最少位数情况为 179487 * 4 = 717948。


解题思路:首先n是原数的最低位,那么n*m%k就是原数的倒数第二位,也就是后一个数的最后一位,那么依次类推,可以把后一个数全部推出来,直到乘数加进位等于n,结束。

ac代码:

#include<iostream>
using namespace std;
int main(){
	int k, w, c, t1, t2, t3;
	while (scanf("%d%d%d", &k, &w, &c)!=EOF){
		t1 = w, t2 = 0;
		for (int i=1; ; i++){
			if (t1 * c  + t2 == w){
				printf("%d\n", i);
				break;
			}
			t3 = (t1 * c + t2) % k;
			t2 = (t1 * c + t2) / k;
			t1 = t3;
		}
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值