您的位置:首页 > 编程语言

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

2016-04-28 19:25 435 查看


参考链接: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;
}

}


程序没有判断输入多少行数据,之间对输入的值进行判断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: