• 二十进制数的加法--【英雄会】


    今天晚上看到群里面交流的信息,发现又出新题了,看了一下,难度还可以,是一般性的题目。事实如此,大家一说简单,一会儿就由三星难度降为二星了...题目不少,有兴趣的朋友们可以去英雄会......

    如题:

    在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都大于0,不超过100位;

    输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。 

    总的来说,这一题难度还可以,只要注意点没忘记,大家应该都是没问题的;

    首先是简单的两个数相加“122” + “221”,当然就是“343”,只要进行正常加减即可;

    接下来是“1aa” + "222",结果是“3cc”;

    以上这两个实例只要将数所对应的数相加即可;

    接下来考虑进位问题:

    “1aa” + "22a",结果是“3d0”;

    这时我们需要考虑进位问题,并将进位标记传到前一个;

    最后是考虑两个数位数不同的数字,这时我们将两个较短的一个数首先加完,最后将长的数前面补上即可,但是这时我们得考虑之前加完的进位问题。

    如对"jaa"+"aa",a+a=20,进位1;a+a+1=21;再次进位1;j+1=20;再次进位1;结果为"1010";

    总体来说,这一题不是什么算法的问题,我们将逻辑弄清楚即可;

    想必这些对大家都是“so easy”...贴上代码,未做过多优化,但是思路清晰:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char start[21] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
    char* calculate (char* x,char* y)
    {
        int length, lengthA, lengthB;
    
        int i, index = 0;
        int poor;
        int temp;
        char* num = (char *)malloc (102);
    
        for(i = 0; i < 102; i++)
            num[i] = '';
        lengthA = strlen(x);  //数x的长度
        lengthB = strlen(y);  //
    
        length = lengthA;
        if(length > lengthB)  //找到较短的数,对其进行相加
            length = lengthB;
    
        for(i = 0; i < length; i++)
        {
            poor = x[lengthA - i - 1] + y[lengthB - i - 1] - '0' - '0';  //将两个数进行相加
            while(poor > 40)  //被加数出现>='a'的,-39即是加上10
                poor -= 39;   //a的ascii是97,0的ascii是48
    
            if(poor >= 20)  //>20,进位
            {
                poor -= 20;
                num[i] = start[poor + index];
                index = 1;  //标记进位
            }
    
            else
            {
                if(poor + index >= 20)  //借助上一次的index成功进位,如对"ja"和"a"
                {
                    poor -= 19;
                    num[i] = start[poor];
                    index = 1;
                }
    
                else  //进行普通相加
                {
                    num[i] = start[poor + index];
                    index = 0;
                }
    
            }
        }
    
        for(i = length; i < lengthA; i++)  //若x的长度长于y
        {
            poor = x[lengthA - i - 1] - '0';
            if(poor > 40)
                poor -= 39;
            if(poor + index >= 20)
            {
                poor -= 19;
                num[i] = start[poor];
                index = 1;
            }
    
            else
            {
                num[i] = start[poor + index];
                index = 0;
            }
        }
    
        if(index == 1 && lengthA > lengthB)
        {
            num[i] = start[1];
            index = 0;
        }
    
        for(i = length; i < lengthB; i++)  //若y的长度长于x
        {
            poor = y[lengthB - i - 1] - '0';
            if(poor > 40)
                poor -= 39;
            if(poor + index >= 20)
            {
                poor -= 19;
                num[i] = start[poor];
                index = 1;
            }
    
            else
            {
                num[i] = start[poor + index];
                index = 0;
            }
        }
        if(index == 1)
        {
            num[i] = start[1];
        }
    
        index = strlen(num);  //此时index是num的长度,进行反转
        for(i = 0; i < index / 2; i++)
        {
            temp = num[i];
            num[i] = num[index - i - 1];
            num[index - i - 1] = temp;
        }
        return num;
    }
    //start 提示:自动阅卷起始唯一标识,请勿删除或增加。
    int main()
    {
        printf("%s",calculate("jaa","aa"));
        return 0;
    }
    //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
    

    修订:在进行后length位相加部分的代码可进行如下优化;

        for(i = 0; i < length; i++)
        {
            poor = x[lengthA - i - 1] + y[lengthB - i - 1] - '0' - '0';  //将两个数进行相加
            while(poor > 40)  //被加数出现>='a'的,-39即是加上10
                poor -= 39;   //a的ascii是97,0的ascii是48
    
            if(poor + index >= 20)  //>20,进位
            {
                poor = poor + index - 20;
                num[i] = start[poor];
                index = 1;  //标记进位
            }
    
            else
            {
                num[i] = start[poor + index];
                index = 0;
            }
        }

    不足之处,还请大家指点...

    o(∩_∩)o

  • 相关阅读:
    excel unixtime与北京时间互转
    vim的漫漫长征路
    const常量
    第一章:绪论
    2.4奇偶校验
    2.3数据校验的基本原理
    2.2定点与浮点数据表示
    2.1机器数及其特点
    1.2计算机系统性能评价
    冯诺依曼结构原理及层次分析
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3508919.html
Copyright © 2020-2023  润新知