1010. Radix (25)

#include<iostream>
#include<cstring>
using namespace std;
long long Cal(char a)
{
	if (a >= '0'&&a <= '9')
		return a - '0';
	else
		return a - 'a' + 10;
}
long long NUM(char N[], long long radix)
{
	long long sum = 0;
	long long i;
	for (i = 0; i <strlen(N); i++)
	{
		sum = Cal(N[i]) + sum*radix;
		if (sum<0)
			return -1;		//sum值過大產生溢出
	}
	return sum;
}
long long MR(char N[])
{
	long long max = 0;
	for (long long i = 0; i < strlen(N); i++)
		if (Cal(N[i]) > max)max = Cal(N[i]);
	return max + 1;
}
int main()
{
	char N1[15], N2[15];
	int Tag;
	long long Radix;
	cin >> N1 >> N2 >> Tag >> Radix;
	if (Tag == 2)
	{
		char tmp[15];
		strcpy(tmp, N2);
		strcpy(N2, N1);
		strcpy(N1, tmp);
	}
	long long num1 = NUM(N1, Radix);
	long long right = num1 + 1;
	long long left = MR(N2);

	while (left <= right)
	{
		long long center = (left + right) / 2;
		if (NUM(N2, center) > num1 || NUM(N2, center) == -1)
			right = center - 1;
		else if (NUM(N2, center) < num1)
			left = center + 1;
		else
		{
			cout << center;
			return 0;
		}
	}
	cout << "Impossible";
	return 0;
}

考的二分查找,關鍵還是題目沒讀懂

二分查找的上下界是給了進制的數到另一個可能的最小進制(MR函數)之間

最需要注意的就是,進制轉換之後的數可能越界,在NUM函數中sum小於零,這個測試點中有

發佈了65 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章