PAT A1010 Radix 测试用例

ps:终于通过了第10个监测点,原来是当输入的N1,N2均为0时,输出的进制为1.。。。。我一直以为进制最小应该从2开始。。。

题目主要就是给定两个数N1,N2,和其中一个的进制,求另一个数的最小进制,使得N1和N2数值相等。

如果大家跑不通,可以试一试我自己的一些用例,基本上跑通这些用例和考虑了二分查找的溢出,就会通过了。


测试用例

N1 N2 tag redix 结果 8 1000 1 10 2 8 1000 2 2 9 8 1000 2 3   1s 1000000 1 36 2 1s 1000000000 2 10 999999972 1s 1000000001 2 10 999999973 1as 1000000001 2 10   0 0 1 100 1 1 0 1 100   11 4 2 100 3


源代码:

#include
#include
#include
#include
using namespace std;
//根据进制计算十进制的值
long long  getValue(string a, long long  radix);
//得到一个数的最大数+1(如899的最大数是10,32的最大数是4,bca的最大数是13)
int getMaxDigit(string a);
//二分搜索
long long  halfsort(string s, long long  minerdigit, long long  maxerdigit, unsigned value);
//比较两个数的大小,radix是未知进制数的进制,target是已知进制数的十进制值
int compare(string a, long long  radix, long long  target);


//这道题有一个前提条件题目没有给出,就是给定的那个数的十进制值要小于long long  的最大值
int main() {
	//给定进制的那个数的十进制值
	long long  value1= 0;
	//N1,N2分别表示两个输入
	string N1,N2;
	cin >> N1 >> N2;
	int tag; long long  radix;
	cin >> tag>>radix;
	//如果给定进制的数是N1
	if (tag == 1) {
		value1 = getValue(N1, radix);
		int maxDigit = getMaxDigit(N2);
		//如果N1,N2都是0,输出1
		if (value1 == 0 && getValue(N2, maxDigit) == 0) {
			cout << 1;
			return 0;
		}
		//如果N1=0 ; i--) {
		if (a[i] - '0' < 10)
			value += (long long )pow(radix, a.length()-1-i)*(a[i] - '0');
		else
			value += (long long )pow(radix, a.length() - 1 - i)*(a[i] - 'a' + 10);	
	
	}
	return value;
}

int getMaxDigit(string a)
{
	int maxDigit = 1;
	for (int i = 0; i < a.length(); i++) {
		int sub = a[i] - '0';
		if (sub < 10 && sub>maxDigit)
			maxDigit = sub;
		else if(sub>=10){
			sub = a[i] - 'a' + 10;
			if (sub > maxDigit)
				maxDigit = sub;

		}
	}
	return maxDigit+1;
}

long long  halfsort(string s, long long  minerdigit,long long  maxerdigit,unsigned value) {
	long long  middle = (minerdigit + maxerdigit) / 2;
	long long compareResult = compare(s, middle, value);
	//递归的出口
	if (maxerdigit - minerdigit <= 1) {
		if (compareResult==0)
			return minerdigit;
		else if (compare(s,maxerdigit,value)==0)
			return maxerdigit;
		//表示impossible,返回0
		else
			return 0;
	}
	if (compareResult == 0)
		return middle;
	else if (compareResult>0)
		return halfsort(s, minerdigit, middle, value);
	else
		return halfsort(s, middle, maxerdigit, value);
}

int compare(string a, long long  radix, long long  target) {
	//暂时的值
	long long  value = 0;
	for (int i = a.length() - 1; i >= 0; i--) {
		int sub = a[i] - '0';
		if (sub< 10) {
	     //溢出或者大于目标值都返回1
			if (value > target || value<0)
				return 1;
			else
			value += (long long )pow(radix, a.length() - 1 - i)*sub;
		}
		else {
			sub = a[i] - 'a' + 10;
			if (value > target || value <0)
				return 1;
			else
			value += (long long )pow(radix, a.length() - 1 - i)*sub;
		}
	}
	if (value == target)
		return 0;
	else if (value > target || value<0)
		return 1;
	else
	return -1;
}

测试通过情况:

 PAT A1010 Radix 测试用例_第1张图片

你可能感兴趣的:(PAT,算法,二分查找)