您的位置:首页 > 其它

1010. Radix (25)

2017-02-15 11:09 246 查看

题目大意 :给两个数N1,N2,告诉其中一个数字的进制为radix,计算N2在什么进制下 N2 == N1,没有输出”Impossible“。

思路:

N2进制的取值是有范围的,下限是N2每一位数字之中的最大值+1 (例如1234 最小肯定是5进制,b 最小肯定是12进制,上限是N1 +1 。

题目中很容易让人想到最大进制是36,但其实不是。radix取值可以非常大所以用long long类型是合理的,例如(* 111 10101 1 100 *)。

因为radix可以非常大,直接从最小进制顺序搜索会有一个case超时 ,所以要采用二分搜索。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

long long ToDec(char num[], long long radix)//转化成10进制
{
long long sum, temp;

sum = 0;
temp = 1;
for (long long i = strlen(num) - 1; i >= 0; i--) {
if (num[i] >= '0' && num[i] <= '9')
sum += (num[i] - '0')*(temp);
else if(num[i] >= 'a' && num[i] <= 'z')
sum += (num[i] - 'a' + 10)*(temp);

temp *= radix;
}
if (sum < 0)//转化的数字已经超过long long了,肯定大于N1这里写图片描述
return -1;
return sum;
}

int minradix(char N[])//最小的进制
{
int j = 0;
int temp;
for (int i = 0; i < strlen(N) ; i++) {
if (N[i] >= '0' && N[i] <= '9')
temp = N[i] - '0';
else if (N[i] >= 'a' && N[i] <= 'z')
temp = N[i] - 'a' + 10;

if (temp > j)
j = temp;
}
return j + 1;//最大的数字 +1 这是最小的进制
}
long long BinSearch(long long high, long long low, long long target, char N[])
{
long long res = -1, min,  tempNum;

while (low <= high) {
min = (low + high) / 2;
tempNum = ToDec(N, min);
if (tempNum == target) {
res = min;
break;
}
else if (tempNum == -1 ||tempNum > target) {
high = min - 1;
}
else if (tempNum < target) {
low = min + 1;
}
}
return res;
}
int main()
{
int tag;
long long radix;
char N1[11], N2[11], temp[11];
scanf("%s%s%d%lld", N1, N2, &tag, &radix);
//printf("%s %s %d %d", N1, N2, tag, radix);

long long target;
long long res, minRadix, maxRadix;

if (2 == tag) {
strcpy(temp, N1);
strcpy(N1, N2);
strcpy(N2, temp);
}

target = ToDec(N1, radix);//目标十进制

minRadix = minradix(N2);
maxRadix = target + 1;

res = BinSearch(maxRadix, minRadix, target, N2);

//int flag = 0;  //直接搜索会有一个case超时
//long long i;
//for (i = minRadix; i <= maxRadix; i++) {
//  if (ToDec(N2, i) == target) {
//      flag = 1;
//      break;
//  }
//}

if (-1 == res)
printf("Impossible");
else
printf("%lld", res);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: