public class Test11 { public static void main(String[] args) { generateNumber(); }
public static void generateNumber() { String startNumber = "A00A"; //开始工号 String newNumber = startNumber; //新的工号 int numberLength = startNumber.length(); int iCount = 0; while (newNumber != "ZZZZ") { newNumber = startNumber; char[] newNumberArray = newNumber.toCharArray(); char[] startNumberArray = startNumber.toCharArray(); int tempCount = iCount; for (int i = numberLength; i > 0; --i) { int div = (int)(Math.pow(26.0, i - 1)); //根据当前是第几位,来选定除数 分别为26的三次方,26的二次方等等 int charIndex = numberLength - i; //当前是第几位工号 newNumberArray[charIndex] += (tempCount / div); tempCount %= div; if (newNumberArray[charIndex] == 'I' || newNumberArray[charIndex] == 'O' || newNumberArray[charIndex] == 'X') { newNumberArray[charIndex] += 1; iCount += div; //当是I、O、X的时向前跳一位,值得注意的是iCount并不是加1,当时最低位时+1,次低位时+26, } if (newNumberArray[charIndex] == '1') { newNumberArray[charIndex] = 'A'; //当是有0进位来的时候,改写成A startNumberArray[charIndex] = 'A'; iCount -= div; //当是0时,改写成A,相当于向后跳了一位,所以减 (27 - 26),如果不减的话,就变成了BB了 } } //cout << newNumber << endl; System.out.println(new String(newNumberArray)); iCount++; } }
}不知道哪里错了。。
你的看着有点晕,自己写了个,main里面全是测试用的代码,方法是increase(String str)这个,传一个当前的进去,返回一个增大1的,目测没有问题....public class ReaderTest { private static final char[] bits = new char[24];
static{ bits[0] = '0'; int index = 1; for(int i = 0; i < 26; i ++){ char c = (char) ('A' + i); if(c != 'I' && c != 'O' && c != 'X') bits[index ++] = c; } } private static String increase(String str){ char[] charArray = str.toCharArray(); for(int i = 0; i < charArray.length; i ++){ int posInArray = charArray.length - 1 - i; int pos = getPosInBits(charArray[posInArray]); if(pos + 1 >= bits.length) charArray[posInArray] = '0'; else{ charArray[posInArray] = bits[pos + 1]; break; } } return new String(charArray); }
private static int getPosInBits(char c){ for(int i = 0; i < bits.length; i ++){ if(bits[i] == c) return i; } return -1; } public static void main(String[] args) throws IOException { for(int i = 0; i < 100; i ++){ char[] randomChar = new char[4]; for(int j = 0; j < randomChar.length; j ++) randomChar[j] = bits[(int) (Math.random() * bits.length)]; String targetString = new String(randomChar); System.out.println("[" + targetString + "] increate 1 to :[" + increase(targetString)+ "]"); } } }
将0A-Z 的24个字符作为字符放入一个字符数组当中, 每次变化,可以认为是24进制的加法运算.public class Test { private char[] store = new char[] { '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'Y', 'Z' };
private int[] nums ;
public Test(String value){ init(value); }
private void init(String value){ char[] tmp = value.toCharArray(); nums = new int[tmp.length]; int i = tmp.length-1; for(char ch:tmp){ nums[i--]=find(ch); } }
private int find(char ch){ return find(ch,0,store.length); }
public static void main(String[] args) {
generateNumber();
}
public static void generateNumber()
{
String startNumber = "A00A"; //开始工号
String newNumber = startNumber; //新的工号
int numberLength = startNumber.length();
int iCount = 0; while (newNumber != "ZZZZ")
{
newNumber = startNumber;
char[] newNumberArray = newNumber.toCharArray();
char[] startNumberArray = startNumber.toCharArray();
int tempCount = iCount; for (int i = numberLength; i > 0; --i)
{
int div = (int)(Math.pow(26.0, i - 1)); //根据当前是第几位,来选定除数 分别为26的三次方,26的二次方等等
int charIndex = numberLength - i; //当前是第几位工号 newNumberArray[charIndex] += (tempCount / div);
tempCount %= div; if (newNumberArray[charIndex] == 'I' || newNumberArray[charIndex] == 'O' || newNumberArray[charIndex] == 'X')
{
newNumberArray[charIndex] += 1;
iCount += div; //当是I、O、X的时向前跳一位,值得注意的是iCount并不是加1,当时最低位时+1,次低位时+26,
} if (newNumberArray[charIndex] == '1')
{
newNumberArray[charIndex] = 'A'; //当是有0进位来的时候,改写成A
startNumberArray[charIndex] = 'A';
iCount -= div; //当是0时,改写成A,相当于向后跳了一位,所以减 (27 - 26),如果不减的话,就变成了BB了
}
} //cout << newNumber << endl;
System.out.println(new String(newNumberArray));
iCount++;
}
}
}不知道哪里错了。。
你的看着有点晕,自己写了个,main里面全是测试用的代码,方法是increase(String str)这个,传一个当前的进去,返回一个增大1的,目测没有问题....public class ReaderTest {
private static final char[] bits = new char[24];
static{
bits[0] = '0';
int index = 1;
for(int i = 0; i < 26; i ++){
char c = (char) ('A' + i);
if(c != 'I' && c != 'O' && c != 'X')
bits[index ++] = c;
}
} private static String increase(String str){
char[] charArray = str.toCharArray();
for(int i = 0; i < charArray.length; i ++){
int posInArray = charArray.length - 1 - i;
int pos = getPosInBits(charArray[posInArray]);
if(pos + 1 >= bits.length)
charArray[posInArray] = '0';
else{
charArray[posInArray] = bits[pos + 1];
break;
}
}
return new String(charArray);
}
private static int getPosInBits(char c){
for(int i = 0; i < bits.length; i ++){
if(bits[i] == c)
return i;
}
return -1;
} public static void main(String[] args) throws IOException {
for(int i = 0; i < 100; i ++){
char[] randomChar = new char[4];
for(int j = 0; j < randomChar.length; j ++)
randomChar[j] = bits[(int) (Math.random() * bits.length)];
String targetString = new String(randomChar);
System.out.println("[" + targetString + "] increate 1 to :[" + increase(targetString)+ "]");
}
}
}
每次变化,可以认为是24进制的加法运算.public class Test { private char[] store = new char[] { '0', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'Y', 'Z' };
private int[] nums ;
public Test(String value){
init(value);
}
private void init(String value){
char[] tmp = value.toCharArray();
nums = new int[tmp.length];
int i = tmp.length-1;
for(char ch:tmp){
nums[i--]=find(ch);
}
}
private int find(char ch){
return find(ch,0,store.length);
}
private int find(char ch,int low,int hight){
int mid = (low+hight)/2;
if(ch==store[mid])
return mid;
if(ch<store[mid]){
return find(ch,low,mid);
}else{
return find(ch,mid,hight);
}
}
public String increase(){
increase(0);
return getValue();
}
private String getValue(){
int size = nums.length;
char[] values = new char[size];
size--;
for(int i : nums){
values[size--]=store[i];
}
return new String(values);
}
private void increase(int i ){
if(i==nums.length){
int[] tmp = new int[i+1];
System.arraycopy(nums, 0, tmp, 0, i);
nums=tmp;
}
int num = nums[i];
num++;
if(num==store.length){
nums[i]=0;
increase(++i);
}else{
nums[i]=num;
}
} /**
* @param args
*/
public static void main(String[] args) {
Test test = new Test("A00A");
System.out.println(test.increase()); }}