大数模拟。。字符串和数字互转,即使用了JAVA还是好麻烦。。注意z字符的处理,转化为26进制,因为给出的字母进制没有0,我加了0来表示,比如说z可以表示为a0,到最后的时候转回来
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main
{
static final Map<Character, BigInteger> map = new HashMap<Character, BigInteger>();
static final BigInteger TWENTY_SIX = BigInteger.valueOf(26);
static final BigInteger ZERO = BigInteger.valueOf(0);
static void init()
{
for (char c = 'a'; c <= 'z'; c++)
map.put(c, BigInteger.valueOf(c + 1 - 'a'));
}
static BigInteger toNumber(String s)
{
BigInteger res = BigInteger.valueOf(0);
for (char c : s.toCharArray())
res = res.multiply(TWENTY_SIX).add(map.get(c));
return res;
}
static String toStr(BigInteger num)
{
String res = "";
while (!num.equals(ZERO))
{
BigInteger[] bb = num.divideAndRemainder(TWENTY_SIX);
num = bb[0];
int rem = bb[1].intValue();
res += rem == 0 ? '0' : (char) (rem - 1 + 'a');
}
return res;
}
static String toZstr(String s)
{
StringBuilder sb = new StringBuilder();
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++)
{
char c = ch[i];
if (c == '0' && i + 1 < ch.length)
{
sb.append('z');
if (ch[i + 1] == 'a')
ch[i + 1] = '0';
else
ch[i + 1]--;
}
else if (c != '0')
sb.append(c);
}
return sb.reverse().toString();
}
static void printNumber(String s)
{
for (int i = 0; i < s.length(); i++)
{
System.out.print(s.charAt(i));
if ((s.length() - 1 - i) > 0 && (s.length() - 1 - i) % 3 == 0)
System.out.print(',');
}
}
public static void main(String[] args)
{
init();
Scanner sc = new Scanner(System.in);
while (true)
{
String line = sc.nextLine().trim();
if ("*".equals(line))
break;
if (Character.isDigit(line.charAt(0)))
{
System.out.format("%-22s", toZstr(toStr(new BigInteger(line))));
printNumber(line);
}
else
{
System.out.format("%-22s", line);
printNumber(toNumber(line).toString());
}
System.out.println();
}
sc.close();
}
}