C++ Pat甲级1010 Radix (25 分)(auto,rbegin(),rend(),max_element())

1010 Radix (25 分)

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers N​1​​ and N​2​​, your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:


N1 N2 tag radix

Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

Sample Input 1:

6 110 1 10

Sample Output 1:

2

Sample Input 2:

1 ab 1 2

Sample Output 2:

Impossible

输入: 两个数N1,N2, tag(1:radix是N1的基数, 2:radix 是N2的基数), radix

 输出:若两个数可互相转化 则另一个数的基数 ,

           若不能互相转换 则输出 Impossible

转:https://blog.csdn.net/liuchuo/article/details/52495925

分析:convert函数:给定一个数值和一个进制,将它转化为10进制。转化过程中可能产生溢出
find_radix函数:找到令两个数值相等的进制数。在查找的过程中,需要使用二分查找算法,如果使用当前进制转化得到数值比另一个大或者小于0,说明这个进制太大~

扫描二维码关注公众号,回复: 5419426 查看本文章
#include <iostream>
#include <cctype>
#include <algorithm>#include <cmath>
using namespace std;
long long convert(string n, long long radix) {//将已知进制的数转换成十进制
	long long sum = 0;
	int index = 0, temp = 0;
	for (auto it = n.rbegin(); it != n.rend(); it++) {
		temp = isdigit(*it) ? *it - '0' : *it - 'a' + 10;
		sum += temp * pow(radix, index++);
	}
	return sum;
}
long long find_radix(string n, long long num) {
	char it = *max_element(n.begin(), n.end());
	//二分查找,找到令两个数相等的基数
	long long low = (isdigit(it) ? it - '0': it - 'a' + 10) + 1;
	long long high = max(num, low);
	while (low <= high) {
		long long mid = (low + high) / 2;
		long long t = convert(n, mid);
		if (t < 0 || t > num) high = mid - 1; //进制太大
		else if (t == num) return mid;
		else low = mid + 1; //进制太小 
	}
	return -1;
}
int main() {
	string n1, n2;
	long long tag = 0, radix = 0, result_radix;
	cin >> n1 >> n2 >> tag >> radix;
	result_radix = tag == 1 ? find_radix(n2, convert(n1, radix)) : find_radix(n1, convert(n2, radix));
	if (result_radix != -1) {
		printf("%lld", result_radix);
	} else {
		printf("Impossible");
	}
	return 0;
}

auto关键字是c++11新引入的关键字,自动推断出变量的类型

rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素

rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置

min_element()和max_element

头文件:#include<algorithm>

作用:返回容器中最小值和最大值。max_element(first,end,cmp);其中cmp为可选择参数!

 

猜你喜欢

转载自blog.csdn.net/qq_37503890/article/details/87904022