PAT 1010. Radix (25)

注意几点:

1. 一定都要用Long long int,不然会错很多case;

2. 注意计算radix的值时,有可能会发生溢出,得到的result结果为负数,此时应该减少radix的值;

3. 不能使用简单的顺序搜索算法,应该使用二分法搜索;

除了只有一位数时候可能出现多个解,其余情况均只有一个解。

二分法搜索能够保证得到的结果唯一并且正确。


//1010. Radix (25)

//注意几点:
//	1. 一定都要用Long long int,不然会错很多case;
//	2. 注意计算radix的值时,有可能会发生溢出,得到的result结果为负数,此时应该减少radix的值;
//	3. 不能使用简单的顺序搜索算法,应该使用二分法搜索;
//		除了只有一位数时候可能出现多个解,其余情况均只有一个解。
//		二分法搜索能够保证得到的结果唯一并且正确。

#include <iostream>  
#include <string.h>  
#include <functional>  
using namespace std;  
  
long long int Cal(char c)  
{  
    if (c >= '0' && c <= '9')  
    {  
        return (c -'0');  
    }  
    else  
        return (c - 'a' + 10);  
}  
  
long long int CalValueBaseRadix(char t[], long long int radix)  
{  
    int i;  
    long long int result = 0;  
    for ( i = 0;i<strlen(t); i++)  
    {  
        result *= radix;  
        result += Cal(t[i]);  
        if (result < 0)  
        {  
            return -1;  
        }  
    }  
    return result;  
}  
  
int main(void)  
{  
#ifdef ONLINE_JUDGE  
#else  
    freopen("D:\\1.txt", "r", stdin);  
#endif  
  
    char a[15], b[15];  
    long long tag;  
    long long radixA, radixB;  
  
    scanf("%s %s %lld %lld", a, b, &tag, &radixA);  
  
    if (tag == 2)  
    {  
        //swap a and b  
        char tmp[15];  
        strcpy(tmp, a);  
        strcpy(a, b);  
        strcpy(b, tmp);  
    }  
  
    long long minRadix, maxRadix;  
  
    //value  
    long long i;  
    long long int valueA = CalValueBaseRadix(a, radixA);  
  
    minRadix = 0;  
    for (i = 0;i<strlen(b);i++)  
    {  
        if( Cal(b[i]) > minRadix)   
            minRadix = Cal(b[i]) + 1;  
    }  


    maxRadix = valueA  + 1;  
    while(minRadix <= maxRadix)  
    {  
        //cal  
        radixB = (minRadix + maxRadix)/2;  
        long long int valueB = CalValueBaseRadix(b, radixB);  
          
        if (valueB == -1 || valueB > valueA)  
        {  
            maxRadix = radixB - 1;  
        }  
        else if (valueB < valueA)  
        {  
            minRadix = radixB + 1;  
        }  
        else if(valueA == valueB)  
        {  
            cout << radixB;  
            return 0;  
        }  
  
    }  
  
    cout << "Impossible";  
    return 0;  
}  




  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值