0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 36进制 
要求 
1、给定一个长度为8的字符串,eg:12345ABC (可变化)
2、给定一个数字,eg:100 (可变化)
需要达到如下效果 
依次生成100个相应的字符串, 12345ABC    //这个在循环前也输出一次 
接着从最后一位开始变化,12345ABC最后一位是C 它在36进制中是第13位,因此这位能产生23个字符串, 12345ABD 
12345ABE 
12345ABF 
12345ABG 
12345ABH 
12345ABI 
12345ABJ 
12345ABK 
12345ABL 
12345ABM 
12345ABN 
12345ABO 
12345ABP 
12345ABQ 
12345ABR 
12345ABS 
12345ABT 
12345ABU 
12345ABV 
12345ABW 
12345ABX 
12345ABY 
12345ABZ 
因为最后一位只能产生23个字符串,而要求为100,所以需要进位,进位后,倒数第一位变为0,在倒数第二位上开始循环,倒数第二位是B, 进位后变成C
12345AC0 
此后,又从倒数第一次开始循环 ,此时最后一位是0 它在36进制中是第1位,因此这位能产生35个字符串, 
12345AC1
12345AC2
12345AC3
12345AC4
12345AC5
12345AC6
12345AC7
12345AC8
12345AC9
12345ACA
12345ACB
12345ACC
12345ACD
...
12345ACW
12345ACX
12345ACY
12345ACZ
因为1+23+36<100,所以需要进位,进位后,倒数第一位变为0,在倒数第二位上开始循环,倒数第二位是C, 进位后变成D
12345AD0
...
12345ADZ
因为1+23+36+36<100,所以需要进位,进位后,倒数第一位变为0,在倒数第二位上开始循环,倒数第二位是D, 进位后变成E
12345AE0 
12345AE1
12345AE2
12345AE3
如此循环直到打印出100位字符串   PS:希望能考虑下后几位为Z的特殊情况:1234ZZZZ进位为
13450000
13450001
...
1345000Z
13450010
13450011
...
1345001Z
...要实现上述功能,希望各位大侠多帮帮忙呀~~~~~

解决方案 »

  1.   


    public class Test {
    public static void main(String... str) {
    String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Map<Character, Integer> map1 = new HashMap<Character, Integer>();
    Map<Integer, Character> map2 = new HashMap<Integer, Character>();
    char[] c = s.toCharArray();
    for (int i = 0; i < 36; i++) {
    map1.put(c[i], i);
    map2.put(i, c[i]);
    }
    String input = "12ZZYYZZZZZ";
    for (int i = 0; i < 100; i++) {
    int index=input.length() - 1 ;
    int value = map1.get(input.charAt(index))
    + 1;
    if (map1.containsValue(value)) {
    input=input.substring(0, input.length() - 1
    )
    + map2.get(value);
    System.out.println(input);
    } else if (value == 36) {
    int num =HowManyZ(input) ;
    StringBuilder sb = new StringBuilder();
    for (int j = 0; j < num; j++) {
    sb.append(0);
    }
    input = (input.substring(0, input.length() -1- num )
    + map2.get(map1.get(input.charAt(input.length()-1 - num))+1))+sb;

    System.out.println(input); }
    }
    } private static int HowManyZ(String str) {
    int time = 1;
    for (int i = str.length() - 1; i >= 1; i--) {
    if (str.charAt(i) == 'Z' && str.charAt(i - 1) == 'Z') {
                    time++;
    }
    else{
    return time;
    }
    }
    return time;
    }
    }
      

  2.   

    说下我的思路吧!(光写文字没有代码,希望别被鄙视,呵呵)
    考虑到abcd等的字母的进位不易问题,将其转换为常用的十进制来处理
    1.将0~9保持不变,a表示为10,.......,z表示为35
    2.主要数据结构,动态数组,最好是用范型,如arraylist<integer>
    3.主要思路,
       函数形式 void process(String value,int num)
       a.检验输入字符串的有效性
       b.初始化,将字符串转换为动态数组,这可以做成一个函数
       c.主体输出,for循环,循环num次
           c.1.检测动态数组的最后一位,如果增一后变成>=36,则调用递归函数进行进位
           c.2.更改动态数组最后一位的值
           c.3.调用转换函数,将动态数组中的数字转换为字符abc的形式
           c.4.输出结果
       结束循环
       d.收尾处理
    4.进位处理要用递归来作,主要考虑到都是zzzzzz这样的字符串形式
      

  3.   

    稍微改了一下
    public class Test {
    public static void main(String[] args) {
    String input = "ZZZZZZZZZZ";
    int num=100;
    getResult(input,num);
    } public static void getResult(String input, int number) {
    String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    Map<Character, Integer> map1 = new HashMap<Character, Integer>();
    Map<Integer, Character> map2 = new HashMap<Integer, Character>();
    char[] c = s.toCharArray();
    for (int i = 0; i < 36; i++) {
    map1.put(c[i], i);
    map2.put(i, c[i]);
    }
    for (int i = 0; i < number; i++) {
    int index = input.length() - 1;
    int value = map1.get(input.charAt(index)) + 1;
    if (map1.containsValue(value)) {
    input = input.substring(0, input.length() - 1)
    + map2.get(value);
    System.out.println(input);
    } else if (value == 36) {
    int num = HowManyZ(input);
    if(num==input.length()){ //处理ZZZZZZZZ这样的字符串,我的处理是字符串前面加上一位0,LZ可以任意定义这个地方,比如程序退出等
    input=0+input;
    }
    StringBuilder sb = new StringBuilder();
    for (int j = 0; j < num; j++) {
    sb.append(0);
    }
    input = (input.substring(0, input.length() - 1 - num) + map2
    .get(map1.get(input.charAt(input.length() - 1 - num)) + 1))
    + sb; System.out.println(input); }
    }
    } private static int HowManyZ(String str) {
    int time = 1;
    for (int i = str.length() - 1; i >= 1; i--) {
    if (str.charAt(i) == 'Z' && str.charAt(i - 1) == 'Z') {
    time++;
    } else {
    return time;
    }
    }
    return time;
    }
    }