PAT (Advanced Level)1010. Radix (25) 二分搜索

题目链接

16分代码

//1010. Radix(基数、根植、计数根)(25)

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int main() {
  char N1[12], N2[12];
  long long int tag, radix;
  long long  bcd1 = 0, bcd2 = 0;
  cin >> N1;
  getchar();
  cin>> N2;
  getchar();
  cin >> tag >> radix;
  int len1 = strlen(N1);
  int len2 = strlen(N2);
  if (tag == 2)
    swap(N1, N2);
  for (int i = len1 - 1; i >= 0; i--) {
    if (N1[i] <= 57)
      bcd1 += (N1[i] - '0') * pow(radix, len1 - i - 1);
    else if (N1[i] >= 97)
      bcd1 += (N1[i] - 'a' + 10) * pow(radix, len1 - i - 1);
  }
  char max = '0';
  int maxx;
  for (int i = 0; i < len2; i++) {
    if (N2[i] > max)
      max = N2[i];
  }
  if (max <= 57)
    maxx = max - '0';
  else if (max >= 97)
    maxx = max - 'a' + 10;
  for(int i=maxx+1; i < bcd1;i++){
    for (int j = len2 - 1; j >= 0; j--) {
      if (N2[j] <= 57)
        bcd2 += (N2[j] - '0') * pow(i, len2 - j - 1);
      else if (N2[j] >= 97)
        bcd2 += (N2[j] -'a' + 10) * pow(i, len2 - j - 1);
    }
    if (bcd2 == bcd1) {
      cout << i << endl;
      break;
    }
    else if (bcd2 > bcd1) {
      cout << "Impossible" << endl;
      break;
    }
    bcd2 = 0;
  }
  if (bcd2 < bcd1) 
    cout <<"Impossible" << endl;
  return 0;
}

25分代码

//1010. Radix(基数、根植、计数根)(25)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
char n1[20], n2[20];
int t, r;
long long tmp;


int result(long long*a, long long k, long long target, int len) {
	long long val2 = 0;
	for (int i = 0; i<len; i++)
		val2 = val2*k + a[i];
	if (val2<0 || val2>target)
		return 1;
	if (val2<target)
		return -1;
	if (val2 == target)
		return 0;
}


//二分搜索进制k
long long binarySearch(long long *a, long long low, long long high, long long target, int len) {
	long long l = low, r = high;
	long long mid;
	while (l <= r) {
		mid = (l + r) / 2;
		if (result(a, mid, target, len) == 0)
			return mid;
		if (result(a, mid, target, len)<0) {
			l = mid + 1;
		}
		else {
			r = mid - 1;
		}
	}
	return -1; //impossible
}


long long int Cal(char c)
{
	if (c >= '0' && c <= '9')
	{
		return (c - '0');
	}
	else
		return (c - 'a' + 10);
}


int main()
{
	cin >> n1 >> n2 >> t >> r;
	if (t == 2) {
		swap(n1, n2); 
	}

	char num[20];
	strcpy(num, n1);
	int len = strlen(num);
	long long val1 = 0; //转化成十进制
	for (int i = 0; i<len; i++) {
		val1 = val1*r + Cal(num[i]);
	}

	strcpy(num, n2);
	len = strlen(num);
	long long low = 0;
	long long a[20]; 
	for (int i = 0; i<len; i++) {
		tmp = Cal(num[i]);
		a[i] = tmp;
		if (tmp>low)
			low = tmp;
	}

	low = low + 1;
	long long high = max(low, val1) + 1;
	long long ans = binarySearch(a, low, high, val1, len);
	if (ans == -1)
		cout << "Impossible" << endl;
	else
		cout << ans << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值