zoukankan      html  css  js  c++  java
  • 1074. 宇宙无敌加法器(20)

    原题: https://www.patest.cn/contests/pat-b-practise/1074

    思路: 就是人工模拟加法的问题, 正常进制都是10, 现在就是进制从字符串中
    读取. 但有些情况要坐下特殊处理, 比如输入的两个数可能位数不一样, 这对
    我们后续计算造成不小的麻烦, 我的做法是强制补前导0, 使输入完全一致.
    另外需要注意两个3位数相加可能得到4位数, 所以结果字符串要开大一些. 题目
    中给的数字范围都没什么暖用, 比如题目中说了输入的两个数是正的, 但结果测试
    仍然会检查输出为0的情况, 试问两个正数相加怎么能得0呢, 但是我们实现的算法
    不管有没有0, 都能正常工作.

    题目中有个数字是有用的, 那就是数字的位数为20位, 这就要求在后续打印数字的
    时候不能采用sscanf进行字符串转数字. 只能采用传统的方法使用getchar一步
    打印

    测试点3和测试点4测试的是数非常大的情况, 比如20位
    测试点5测试的是输出0的情况

    实现:

    #include <stdio.h>
    #include <string.h>
    #define LEN 30
    
    int main (void) {
        char table[LEN];
        int len;
        char num1[LEN];
        char num2[LEN];
        char res[LEN];
        char tmp1[LEN];
        char tmp2[LEN];
        int i;
        int j;
    
        table[0] = '0';
        scanf("%s", table + 1);
        scanf("%s", tmp1);
        scanf("%s", tmp2);
        len = strlen(table);
        for (i = 0; i < len; i++) {
            num1[i] = '0';
            num2[i] = '0';
            res[i] = '0';
        }
        i = len - 1;
        for (j = strlen(tmp1) - 1; j >= 0; j--) num1[i--] = tmp1[j];
        num1[len] = ''; // 这个不能少
        i = len - 1;
        for (j = strlen(tmp2) - 1; j >= 0; j--) num2[i--] = tmp2[j];
        num2[len] = '';
    
        int now;
        int carry = 0; // 进位
        int sys;       // 进制
        for (i = len - 1; i >= 0; i--) {
            if (table[i] == '0') {
                sys = 10;
            } else {
                sys = table[i] - '0';
            }
            now = (num1[i] - '0') + (num2[i] - '0') + carry;
            if (now < sys) {
                res[i] = now + '0';
                carry = 0;
            } else {
                carry = 1;
                res[i] = now - sys + '0';
            }
        }
        res[len] = ''; // 这行也可以不需要
    
        for (i = 0; i < len; i++) {
            if (res[i] != '0') break;
        }
        if (i == len) {
            printf("0");
        } else {
            for (; i < len; i++) {
                printf("%c", res[i]);
            }
        }
    
        return 0;
    }
    
    
  • 相关阅读:
    python的进阶--爬虫小试
    【centos 7】搭FTP服务和web访问
    centos 7 安装python3.5
    centos 6.5 安装mysql 5.6.35--libc.so.6(GLIBC_2.14)(64bit)
    windows 10 下安装python 2.7
    centos7-硬盘坏道检测
    centos7 默认进入系统命令行模式修改
    zabbix安装配置(2.4.5)
    Centos 7 mysql 安装使用记
    docker部署angular和asp.net core组成的前后端分离项目
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7898392.html
Copyright © 2011-2022 走看看