2016百度实习编程题:编号转换

参考链接:http://www.cnblogs.com/sshoub/archive/2011/07/29/2121312.html

根据参考链接中的算法,我这样理解

ABCDEF,这个看出一个26进制的数,0<->Z、1<->A、2<->B

题目要求我们将十进制数 和 26进制数进行转换

26进制数字转换成十进制

注意:越靠近后面的字符,对于的位权越低

如下代码:

    public static int AZTonum1(String str){
        int r = 0;
        int p = 0;
        int n = str.length() ;
        for(int i = n-1;i>=0;i--){
            if(r ==0){
                p = str.charAt(i) - 'A' +1;
                r = 26;
            }else{
                p = p + r *( str.charAt(i) - 'A' +1);
                r = r * 26;
            }        
        }
        return p;
    }

在上面博客评论中有下面的代码

    public static int AZTonum(String str){
        int r = 0;
        for(int i = 0;i<str.length();i++){
            r = r * 26 + str.charAt(i) - 'A' +1;
        }
        return r;
    }

这里每次更新需要乘以26来源 大于 26进一位

十进制数转换成26进制

这里就是连除

    public static String numToAZ(int num){
        if(num == 0)
            return "Z";
        int r = 0;
        String result="";
        while(num!=0){
            r = num%26;
            char ch = ' ';
            if(r ==0)
                ch ='Z';
            else
                ch = (char)(r -1 + 'A');
            result = ch + result;
            if(result.charAt(0) == 'Z')
                num = num/26-1;
            else
                num/=26;
        }
        return result;
    }

整体实现代码:

import java.util.Scanner;


public class Main {

    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str=null;
        String[] A;
        String patternRC = "R[\d]+C[\d]+";
        String patternAZ = "[A-Z]+[\d]+";
        int num;
        String res;
        while(in.hasNext()){
            str = in.next();
            res ="";
            num =0;
            //Rx C y 模式 R23C55 提取 55 转换成26进制
            if(str.matches(patternRC)){
                int id = str.indexOf('C');
                String x = str.substring(1,id);
                String y = str.substring(id+1);
                int ynum = Integer.valueOf(y);
                res = numToAZ(ynum);
                res = res + x;
                System.out.println(res);
                // BC23 提取BC转换成 十进制
            }else if(str.matches(patternAZ)){
//                System.out.println(str);
                String x = str.replaceAll("[A-Z]+","");
                str = str.replaceAll("[\d]+","");
                int y = AZTonum(str);
                res = "R" + x + "C" + y;
                System.out.println(res);
            }else{
                System.out.println("输入非法");
            }
        }
        System.out.println();

    }
    public static int AZTonum(String str){
        int r = 0;
        for(int i = 0;i<str.length();i++){
            r = r * 26 + str.charAt(i) - 'A' +1;
        }
        return r;
    }
    public static int AZTonum1(String str){
        int r = 0;
        int p = 0;
        int n = str.length() ;
        for(int i = n-1;i>=0;i--){
            if(r ==0){
                p = str.charAt(i) - 'A' +1;
                r = 26;
            }else{
                p = p + r *( str.charAt(i) - 'A' +1);
                r = r * 26;
            }        
        }
        return p;
    }
    public static String numToAZ(int num){
        if(num == 0)
            return "Z";
        int r = 0;
        String result="";
        while(num!=0){
            r = num%26;
            char ch = ' ';
            if(r ==0)
                ch ='Z';
            else
                ch = (char)(r -1 + 'A');
            result = ch + result;
            if(result.charAt(0) == 'Z')
                num = num/26-1;
            else
                num/=26;
        }
        return result;
    }

}

程序没有判断输入多少行数据,之间对输入的值进行判断

原文地址:https://www.cnblogs.com/bbbblog/p/5443825.html