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、给定一个长度为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
...要实现上述功能,希望各位大侠多帮帮忙呀~~~~~
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;
}
}
考虑到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这样的字符串形式
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;
}
}