A1010. Radix

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is “yes”, if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number “radix” is the radix of N1 if “tag” is 1, or of N2 if “tag” is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print “Impossible”. If the solution is not unique, output the smallest possible radix.

Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

char n1[20], n2[20], temp[20];
int tag, radix;
long long Map[256];
long long inf = 1LL << 63 - 1;

void init() {
    for (char c = '0'; c <= '9'; c++) {
        Map[c] = c - '0';
    }
    for (char c = 'a'; c <= 'z'; c++) {
        Map[c] = c - 'a' + 10;
    }
}

long long convertNum10(char a[], long long radix, long long t) {
    long long ans = 0;
    int len = strlen(a);
    for (int i = 0; i < len; i++) {
        ans = ans * radix + Map[a[i]];
        if (ans < 0 || ans > t) {
            return -1;
        }
    }
    return ans;
}

int cmp(char a[], long long radix, long long t) {
    int len = strlen(a);
    long long num = convertNum10(a, radix, t);
    if (num < 0) {
        return 1;
    }
    if (t > num) {
        return - 1;
    } else if (t == num) {
        return 0;
    } else {
        return 1;
    }
}

long long binarySearch(char a[], long long left, long long right, long long t) {
    long long mid;
    while (left <= right) {
        mid = (left + right) / 2;
        int flag = cmp(a, mid, t);
        if (flag == 0) {
            return mid;
        } else if (flag == -1) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}

int findLargestDigit(char a[]) {
    int ans = -1;
    int len = strlen(a);
    for (int i = 0; i < len; i++) {
        if (Map[a[i]] > ans) {
            ans = Map[a[i]];
        }
    }
    return ans + 1;
}

int main() {
    init();
    scanf("%s %s %d %d", n1, n2, &tag, &radix);
    if (tag == 2) {
        strcpy(temp, n1);
        strcpy(n1, n2);
        strcpy(n2, temp);
    }
    long long t = convertNum10(n1, radix, inf);
    long long low = findLargestDigit(n2);  // об╫Г
    long long high = max(low, t) + 1;  // ио╫Г
    long long ans = binarySearch(n2, low, high, t);
    if (ans == -1) {
        printf("Impossible\n");
    } else {
        printf("%lld\n", ans);
    }
    return 0;
}
### 解决 A2088 和 A1010 错误的分析与修正 在汇编语言中,错误代码 `A2088` 和 `A1010` 通常表示语法或结构上的问题。具体来说: - **A2088 Error**:此错误通常表示“未找到段定义”。这可能是因为代码段、数据段或堆栈段的定义不完整或缺失[^1]。 - **A1010 Error**:此错误通常表示“未终止的宏调用”或“未正确结束的块定义”,例如缺少 `ENDS` 或 `END` 关键字[^2]。 以下是对用户提供的二进制打印代码进行详细检查和修正的方案: --- #### 1. 检查段定义完整性 确保所有段(数据段、堆栈段和代码段)都已正确定义并结束。以下是修正后的段定义部分: ```asm DATAS SEGMENT mystring DB '101010' ; 示例二进制字符串 mystringlen DB 6 ; 字符串长度 DATAS ENDS STACKS SEGMENT DW 100H DUP(?) ; 定义 100H 字节的堆栈空间 STACKS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS, SS:STACKS ``` 上述代码中,`DATAS` 和 `STACKS` 段均以 `ENDS` 结束,且 `CODES` 段明确指定了 `ASSUME` 指令以关联段寄存器[^3]。 --- #### 2. 确保代码段的正确结束 代码段必须以 `END` 指令结束,且程序入口点需明确指定为 `START`。以下是修正后的代码段结束部分: ```asm exit_program: MOV AH, 4CH ; 系统调用号 (sys_exit) XOR AL, AL ; 返回状态码 0 INT 21H ; 调用 DOS 中断 CODES ENDS END START ; 指定程序入口点为 START ``` --- #### 3. 修正循环逻辑中的潜在问题 在循环逻辑中,确保索引寄存器 `BX` 的初始化和递增操作正确无误。以下是修正后的循环部分: ```asm XOR BX, BX ; 初始化索引寄存器 BX 为 0 print_loop: CMP BL, [mystringlen] ; 比较当前索引与字符串长度 JGE exit_program ; 如果索引超出范围,退出程序 MOV AL, [mystring + BX] ; 加载当前字符到 AL SUB AL, '0' ; 转换为数值 (0 或 1) AND AL, 1 ; 确保 AL 中只有最低位有效 PUSH AX ; 保存 AL 的值 MOV AX, BX ; 将索引加载到 AX TEST AX, 1 ; 检查索引是奇数还是偶数 JZ even_index ; 如果索引是偶数,跳转到 even_index odd_index: CMP AL, 1 ; 检查当前比特是否为 1 JE print_black_white_1 ; 如果是 1,打印黑底白字的 '1' JMP print_blue_red_0 ; 否则打印蓝底红字的 '0' even_index: CMP AL, 1 ; 检查当前比特是否为 1 JE print_white_black_1 ; 如果是 1,打印白底黑字的 '1' JMP print_red_blue_0 ; 否则打印红底蓝字的 '0' next_char: INC BX ; 增加索引 JMP print_loop ; 返回循环开始 ``` --- #### 4. 确保 BIOS 中断调用的正确性 BIOS 中断调用 `INT 10H` 必须正确设置寄存器值。以下是修正后的打印子例程部分: ```asm print_black_white_1: MOV AH, 0x0E ; BIOS teletype 服务 MOV AL, '1' ; 打印字符 '1' MOV BH, 0x00 ; 页面号 MOV BL, 0x0F ; 黑底白字颜色属性 INT 0x10 ; 调用 BIOS 中断 JMP next_char ; 跳转到下一个字符 print_white_black_1: MOV AH, 0x0E ; BIOS teletype 服务 MOV AL, '1' ; 打印字符 '1' MOV BH, 0x00 ; 页面号 MOV BL, 0x07 ; 白底黑字颜色属性 INT 0x10 ; 调用 BIOS 中断 JMP next_char ; 跳转到下一个字符 print_blue_red_0: MOV AH, 0x0E ; BIOS teletype 服务 MOV AL, '0' ; 打印字符 '0' MOV BH, 0x00 ; 页面号 MOV BL, 0x1C ; 蓝底红字颜色属性 INT 0x10 ; 调用 BIOS 中断 JMP next_char ; 跳转到下一个字符 print_red_blue_0: MOV AH, 0x0E ; BIOS teletype 服务 MOV AL, '0' ; 打印字符 '0' MOV BH, 0x00 ; 页面号 MOV BL, 0x4A ; 红底蓝字颜色属性 INT 0x10 ; 调用 BIOS 中断 JMP next_char ; 跳转到下一个字符 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值