36进制加法

36进制由0-9,a-z,共36个字符表示,最小为’0’, ‘0’、‘9’对应十进制的09,‘a’、‘z’对应十进制的1035

例如:

‘1b‘ 换算成10进制等于 1 * 36^1 + 11 * 36^0 = 36 + 11 = 47

要求按照加法规则计算出任意两个36进制正整数的和

如:按照加法规则,计算‘1b‘ + ‘2x‘ = ‘48‘

要求:

不允许把36进制数字整体转为10进制数字,计算出10进制数字的相加结果再转回为36进制

思路
按照十进制的加法方法,满36向前进一位

public class jinzhizhuanhuan {
    static Character[] nums = { ‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘ };
    //asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法,后台的数据仍是数组。
    static List<Character> list = Arrays.asList(nums);

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        String str1 = scan.next();
        String str2 = scan.next();
        String r=f(str1,str2);
        System.out.println(r);
    }

    static String f(String str1, String str2) {
        //toCharArray()方法可以将字符串对象中的字符转换为一个字符数组
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        //数组从0开始,因此减1
        int i = s1.length - 1;
        int j = s2.length - 1;
        int temp = 0;// 进位
        //也可以使用StringBuffer,但是它比 StringBuilder要慢。 在 StringBuilder 上的主要操作是 append 和 insert 方法。
        StringBuilder sb = new StringBuilder();
        //两个相加的数的位数相同
        while (i >= 0 && j >= 0) {
            char c1 = s1[i];
            char c2 = s2[j];
            //返回指定字符在此字符串中第一次出现处的索引
            int index1 = list.indexOf(c1);
            int index2 = list.indexOf(c2);
            int sum = index1 + index2 + temp;
            if (sum >= 36) {
                temp = 1;
            //有进位时,用append()将余数进行拼接
                sb.append(list.get(sum % 36));
            } else {
            //没有进位时,直接将相加得到的数进行拼接
                temp=0;
                sb.append(list.get(sum));
            }
            //--是因为要从低位开始相加
            i--;
            j--;
        }
        //第一个数位数多于第二个数的位数
        while (i >= 0) {
            int sum = list.indexOf(s1[i]) + temp;
            if (sum >=36) {
                temp = 1;
                sb.append(list.get(sum % 36));
            } else {
                temp=0;
                sb.append(list.get(sum));
            }
            i--;
        }
        //第一个数位数小于第二个数的位数
        while (j >= 0) {
            int sum = list.indexOf(s2[j]) + temp;
            if (sum >=36) {
                temp = 1;
                sb.append(list.get(sum % 36));
            } else {
                temp=0;
                sb.append(list.get(sum));
            }
            j--;
        }
        //temp!=0说明有进位,这是需要把进位的1拼接
        if(temp!=0){
            sb.append(‘1‘);
        }
        //前面拼接是从个位开始的,也就是拼接出来的数跟所求的数是倒着的
        //reverse() 方法用于颠倒数组中元素的顺序
        return sb.reverse().toString();
    }
}

原文地址:https://www.cnblogs.com/twoheads/p/11706433.html

时间: 2024-10-12 23:53:27

36进制加法的相关文章

洛谷 P1604 B进制星球 高精度多进制加法

P1604 B进制星球 时空限制1s / 128MB 题目背景 进制题目,而且还是个计算器~~ 题目描述 话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球.因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数.星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们. 现在小Z希望你可以帮助他,编写实现B进制加法的程序. 输入输出格式 输入格式: 共3行第1行:一个十进制的整数,表示进制B.第2-3行:每行一个B

HDU1720 A+B Coming (16进制加法)

16进制加法 1 #include<stdio.h> 2 int main() 3 { 4 int a,b; 5 while(scanf("%x %x",&a,&b)!=EOF) 6 { 7 printf("%d\n",a+b); 8 } 9 } HDU1720 A+B Coming (16进制加法),码迷,mamicode.com

详解2进制,10进制,16进制,8进制,36进制

本篇介绍C/C++语言中的进制的概念,主要介绍2进制.10进制.16进制,这三种是编程时必须掌握的也是最经常使用的.另外,介绍8进制和36进制,当中 36进制在实际project项目中会遇到. (本文选自<C/C++学习指南>.邵发.附录"2进制,10进制,16进制") 讲2进制.10进制.16进制的视频教程,点击观看 权利声明:作者拥有本书的所有权利. 作者授权不论什么人都能够自由转载本站点公布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载.不得有不论什么改动,

PHP生成唯一编号 36进制不重复编号

PHP实现生成唯一编号,文中使用10进制转换36进制得到不重复的6000多万个唯一编号,编号位数为10位. 当要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号.我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35.这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的

ACM--26进制加法--HDOJ 2100--Lovekey--大数--字符串处理

HDOJ题目地址:传送门 Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7783    Accepted Submission(s): 2519 Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26

ORACLE 36进制和10进制,互相转换函数

第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int  is returnValue int;   str36     varchar(36);   subWork   varchar(1);   workIndex   int;   len     int;   i       int; begin returnValue:= 0;   str36 := '123456789ABCDEFGHIJK

10进制正整数转4位定长的36进制字符串

题目描述: 请设计一个函数可以把10进制的正整数转换为4位定长的36进制字符串. 36进制的规则为:“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”; 举例说明: 1=“0001” 10=“000A” 20=“000K” 35=“000Z” 36=“0010” 100=“002S” 2000=“01JK” 这是腾讯2015校园招聘技术类研发笔试题中的一题,给出自己的答案,欢迎拍砖. solution: string convert(int x) { string re

详细解释2进制,10进制,16进制,8进制,36进制

本篇介绍C/C++语言中的进制的概念,主要介绍2进制.10进制.16进制,这三种是编程时必须掌握的也是最常用的.另外,介绍8进制和36进制,其中 36进制在实际工程项目中会遇到. (本文选自<C/C++学习指南>,邵发,附录"2进制,10进制,16进制") 权利声明:作者拥有本书的全部权利.作者授权任何人都可以自由转载本网站发布的内容,但转载时必须遵守以下限制: ①转载时必须全文转载,不得有任何修改,必须包含"权利声明"和"官网地址"

Oracle 10进制转36进制

CREATE OR REPLACE FUNCTION IDFMS.func_dec236 (parm IN INT DEFAULT 0)   RETURN VARCHAR2IS   /*   10进制数转36进制数   */   src   VARCHAR2 (36) := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; --改成其它字符串,就是任意进制   LEN   INT;   res   VARCHAR2 (10) := '';   tmp   INT;