也许我在数学方面还不够好,但我在将数字转换为纯字母
Bijective Hexavigesimal时遇到问题,就像Microsoft Excel / OpenOffice Calc的做法一样.
var toHexvg = function(a){ var x=''; var let="_abcdefghijklmnopqrstuvwxyz"; var len=let.length; var b=a; var cnt=0; var y = Array(); do{ a=(a-(a%len))/len; cnt++; }while(a!=0) a=b; var vnt=0; do{ b+=Math.pow((len),vnt)*Math.floor(a/Math.pow((len),vnt+1)); vnt++; }while(vnt!=cnt) var c=b; do{ y.unshift( c%len ); c=(c-(c%len))/len; }while(c!=0) for(var i in y)x+=let[y[i]]; return x; }
我努力的最佳结果是:a b c d … y z ba bb bc – 虽然不是上面的实际代码.预期的输出是b b … y z aa ab ac … zz aaa aab aac … zzzzz aaaaaa aaaaab,你得到的图片.
基本上,我的问题更多的是做“数学”而不是功能.最终我的问题是:如何在Hexavigesimal转换中进行数学运算,直到[假设]无穷大,就像Microsoft Excel一样.
如果可能的话,还有源代码,提前谢谢.
解决方法
好的,这是我的尝试,假设您希望序列以“a”(代表0)开头并且继续:
a,b,c,...,y,z,aa,ab,ac,zy,zz,aaa,aab,...
这有效,希望有一定道理.时髦的线是因为它在数学上更有意义0用空字符串表示然后“a”将是1,等等.
alpha = "abcdefghijklmnopqrstuvwxyz"; function hex(a) { // First figure out how many digits there are. a += 1; // This line is funky c = 0; var x = 1; while (a >= x) { c++; a -= x; x *= 26; } // Now you can do normal base conversion. var s = ""; for (var i = 0; i < c; i++) { s = alpha.charAt(a % 26) + s; a = Math.floor(a/26); } return s; }
但是,如果您打算按顺序打印它们,那么有更有效的方法.例如,使用递归和/或前缀和东西.