PAT 1010. Radix (25)

本文详细介绍了一种使用二分法搜索解决基数转换问题的有效算法。该算法适用于长整型数值处理,能够有效避免溢出,并确保结果的准确性和唯一性。通过具体实现案例,展示了如何从一种基数下的数值表示转换到另一种基数下的表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意几点:

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;  
}  




### 关于 `sc_radix` 的解释 在编程环境中,`sc_radix` 并不是一个标准的内置函数或关键字。然而,在某些特定领域或者库中可能存在类似的定义或实现方式。以下是可能涉及的内容: #### 可能的应用场景之一:数值转换中的基数 在许多程序设计语言中,`radix` 常用于表示数制(即进制)。例如,在 JavaScript 中可以使用 `parseInt(string, radix)` 函数来解析字符串并将其转换为指定进制的整数[^4]。 ```javascript const decimalValue = parseInt("1A", 16); // 将十六进制字符串 "1A" 转换为十进制值 26 console.log(decimalValue); ``` 如果提到 `sc_radix`,可能是某种上下文中自定义的一个变量名、函数名称或者是某个宏定义的一部分。这种情况下,它通常用来控制数值转换时所使用的进制。 #### 宏定义中的应用可能性 从引用内容来看,存在关于宏定义的部分描述[^2]。假设在一个 C 或者其他支持预处理的语言环境下,“sc_radix” 可能被用作如下形式: ```c #define SC_RADIX(x) ((x) >= '0' && (x) <= '9') ? 10 : \ ((x) >= 'A' && (x) <= 'F') || ((x) >= 'a' && (x) <= 'f') ? 16 : 8 ``` 上述例子展示了一个简单的条件判断逻辑,其中根据输入字符决定采用哪种进制作为默认值。如果是数字,则返回十进制;若是字母 A-F/a-f 则返回十六进制;其余情况则假定八进制。 #### XML 文档创建过程关联分析 另外一段引用提到了通过 DOM API 创建节点的操作[^1]。虽然这里并没有直接提及到 “sc_radix”,但如果是在构建配置文件或是数据交换格式的时候需要用到不同进位系统的表达方法的话,那么也许会间接涉及到该概念。 比如当我们要动态生成包含多种编码信息的数据结构时,可能会这样写: ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.newDocument(); // Create root element and set attribute using specific base(radix) Element personElm = doc.createElement("person"); Attr attrRadix = doc.createAttribute("radix"); attrRadix.setValue(Integer.toString(16)); // Set hexadecimal as example here. personElm.setAttributeNode(attrRadix); doc.appendChild(personElm); System.out.println(convertDOMToString(doc)); ``` 此代码片段展示了如何向新建立的人工智能对象添加属性,并设置其值代表某一种特殊的计数体系——在这里我们选择了十六进制为例说明问题。 ### 总结 由于缺乏更具体的背景资料,目前只能推测 `sc_radix` 应该是用来指示或者操作有关数系变换方面的参数设定项。具体含义还需依据实际项目文档进一步确认。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值