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保护变量(_),私有变量(__),私有方法,
    避免在循环体中创建对象
    HashMap的初始容量(initialCapacity)和装载因子(loadFactor)
    深入理解Java的接口和抽象类
    关于◎SuppressWarnings("unchecked")
    缓存技术PK:选择Memcached还是Redis?
    Maven详解之聚合与继承
    浅谈redis和memcached的区别
    《玩转Spring》第二章 BeanPostProcessor扩展
    使用Spring实现读写分离( MySQL实现主从复制)
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7898392.html
Copyright © 2011-2022 走看看