Sicily 1028. Hanoi Tower Sequence【高精度取余和除法】

题目链接在此

这道题目有点意思。渣渣我从这位大神这里得到了解题奥妙。


找某个数的二进制从右边数第一个“1”是第几位即可。

由于这题的数可能很大,那么就要使用高精度除法和取余了=。=

思路就是模仿手算除法。1020就是道高精度取余的题,与这道题可以互相借鉴。


源代码如下:

#include<iostream>
#include<string>

using namespace std;

int charToInt(char a) {
	return a - '0';
}

char intToChar(int n) {
	return n + '0';
}

int main() {
	int caseNum;
	string num;
	int modResult;  //  记录除法过程中的余数
	bool isFirst = true;

	cin >> caseNum;
	for (int t = 1; t <= caseNum; t++) {
		if (isFirst)
			isFirst = false;
		else
			cout << endl;

		cin >> num;

		int FirstOneInBinary = 0;  //  记录从右边数第一个“1”出现在第几位。
		while (true) {
			FirstOneInBinary++;
			modResult = charToInt(num[0]) % 2;
			num[0] = intToChar(charToInt(num[0]) / 2);

			for (int i = 1; i < num.length(); i++) {
				//  每次做除法时,逐位更新num的值
				char originalNum = num[i];
				num[i] = intToChar((modResult * 10 + charToInt(originalNum)) / 2);
				modResult = (modResult * 10 + charToInt(originalNum)) % 2;
			}

			if (modResult == 1)
				break;
		}

		cout << "Case " << t << ": " << FirstOneInBinary << endl;
	}

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值