2011-12-22 41 views
5

Có lẽ tôi không đủ giỏi về toán học, nhưng tôi đang gặp vấn đề khi chuyển đổi một số thành chữ cái thuần túy Bijective Hexavigesimal giống như cách Microsoft Excel/OpenOffice Calc làm điều đó.Làm thế nào để tạo ra một hàm chuyển đổi một số thành Hexavigesimal tính từ?

Đây là một phiên bản của mã của tôi nhưng không cho tôi ra tôi cần:

 

    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; 
    } 

Sản lượng tốt nhất của những nỗ lực của tôi có thể nhận được là: a b c d ... y z ba bb bc - mặc dù không phải là mã thực tế trên. Đầu ra dự định được giả sử là a b c ... y z aa ab ac ... zz aaa aab aac ... zzzzz aaaaaa aaaaab, bạn sẽ có được hình ảnh.

Về cơ bản, sự cố của tôi là nhiều hơn khi thực hiện '' toán '' thay vì hàm. Cuối cùng câu hỏi của tôi là: Làm thế nào để làm Toán trong chuyển đổi Hexavigesimal, cho đến khi [vô hạn] vô cùng, giống như Microsoft Excel.

Và nếu có thể, mã nguồn, cảm ơn bạn trước.

+1

'aa' không thực sự có ý nghĩa. Đó là '00'. "Số" sau 'z' là' ba', vì vậy kết quả của bạn có vẻ đúng. Hoặc là '_' của bạn' 0', có vẻ kỳ lạ? –

+1

uhm, xin lỗi về mã mẫu, đoán tôi không nên đăng nó, tôi nghĩ rằng nó đã thể hiện câu hỏi của tôi phức tạp hơn, ahaha ... Nhưng, tôi đoán dòng dưới cùng của tôi là tôi cần một mã mà kết quả đầu ra yz aa ab và không phải yx ba bb ... Và bạn có thể nói '_' là 0, nhưng tình huống tôi cần là không có phần nào của đầu ra có thể chứa bất kỳ '_'... ^^ hmmm – GheloAce

+0

^[sửa]: Và bạn có thể nói '\ _' (gạch dưới) là 0, nhưng tình huống tôi cần là không có phần nào của đầu ra có thể KHÔNG chứa bất kỳ '\ _' (gạch dưới) nào ... – GheloAce

Trả lời

10

Được rồi, đây là nỗ lực của tôi, giả sử bạn muốn chuỗi được bắt đầu với "a" (đại diện cho 0) và đi:

a, b, c, ..., y, z, aa, ab, ac, ..., zy, zz, aaa, aab, ... 

này hoạt động và hy vọng làm cho một số ý nghĩa. Dòng sôi nổi là có vì nó về mặt toán học có ý nghĩa hơn đối với từ 0 đến được đại diện bởi các chuỗi rỗng và sau đó "a" sẽ là 1, vv

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; 
} 

Tuy nhiên, nếu bạn đang có kế hoạch chỉ đơn giản là in chúng ra theo thứ tự, có nhiều phương pháp hiệu quả hơn nhiều. Ví dụ: sử dụng đệ quy và/hoặc tiền tố và nội dung.

+0

+1 để sử dụng "C++" trong câu trả lời của bạn. – Jesse

+0

Cảm ơn bạn !!^^ Bạn thật tuyệt vời ..! Tôi không bao giờ nghĩ đến việc làm theo cách đó ... Cảm ơn bạn nhiều ... Tôi sẽ đặt tên ur vào các khoản tín dụng khi trang web đang hoạt động và chạy, cảm ơn bạn ... - ^^ – GheloAce

+0

Không phải lo lắng, không cần tín dụng, mã nên được chia sẻ và thao tác một cách tự do. Bên cạnh đó, user826788 không phải là rất lãng mạn ... Cảm ơn @ Jesse, thậm chí không nhận thấy! – karnok

-2

a đại diện cho 0z đại diện cho 25. Vì vậy, số sau z26, là 1*26 + 0, vì vậy ba là chính xác. (Và số sau zzzzzbaaaaa.)

+0

uhm, tôi đoán, nhưng làm thế nào để chương trình nó để đảm bảo rằng bên cạnh zzz là aaaa ..? Cũng giống như các cột trong Excel/Calc ..? ^^ – GheloAce

+0

Ồ, tôi không có Excel calc tôi sợ. Tôi nghi ngờ rằng họ chỉ đang giảm bức thư đầu tiên một. – TonyK

+2

Nó không đơn giản như a = 0 đến z = 25. Hệ thống là sau z nó đi đến aa. Sau đó, sau khi zz là aaa. Vv Vì vậy, việc tìm kiếm số _nth_ phức tạp hơn chỉ là một chuyển đổi thành cơ số 26 với các chữ cái như chữ số. – nnnnnn

0

Tôi không hiểu làm thế nào để làm việc nó ra từ một công thức, nhưng tôi đùa giỡn với nó trong một thời gian và đã đưa ra các thuật toán sau đây để theo nghĩa đen đếm đến số cột yêu cầu:

var getAlpha = (function() { 
    var alphas = [null, "a"], 
     highest = [1]; 

    return function(decNum) { 
     if (alphas[decNum]) 
      return alphas[decNum]; 

     var d, 
      next, 
      carry, 
      i = alphas.length; 

     for(; i <= decNum; i++) { 
      next = ""; 
      carry = true; 
      for(d = 0; d < highest.length; d++){ 
       if (carry) { 
        if (highest[d] === 26) { 
         highest[d] = 1; 
        } else { 
         highest[d]++; 
         carry = false; 
        } 
       } 
       next = String.fromCharCode(
          highest[d] + 96) 
        + next; 
      } 
      if (carry) { 
       highest.push(1); 
       next = "a" + next; 
      } 
      alphas[i] = next; 
     } 

     return alphas[decNum]; 
    }; 
})(); 


alert(getAlpha(27));  // "aa" 
alert(getAlpha(100000)); // "eqxd" 

Bản trình diễn: http://jsfiddle.net/6SE2f/1/

Mảng highest giữ số cao nhất hiện tại với phần tử mảng trên "chữ số" (phần tử 0 là "chữ số" ít quan trọng nhất). Khi tôi bắt đầu ở trên, có vẻ như bạn nên lưu vào bộ nhớ cache mỗi giá trị khi được tính toán, để tiết kiệm thời gian nếu cùng một giá trị được yêu cầu một lần nữa, nhưng trong thực tế (với Chrome) nó chỉ mất khoảng 3 giây để tính toán 1.000.000 giá trị (bdwgn) và khoảng 20 giây để tính giá trị 10.000.000 (uvxxk). Khi xóa bộ nhớ đệm, mất khoảng 14 giây cho giá trị 10.000.000.

3

Mặc dù @ user826788 đã đăng một mã hoạt động (thậm chí nhanh hơn một phần ba), tôi sẽ đăng công việc của riêng mình, trước khi tìm các bài đăng ở đây (vì tôi không biết từ "hexavigesimal"). Tuy nhiên nó cũng bao gồm các chức năng cho các cách khác tròn.Lưu ý rằng tôi sử dụng a = 1 như tôi sử dụng nó để chuyển đổi các yếu tố danh sách xuất phát từ

aa) first 
ab) second 

để

<ol type="a" start="27"> 
<li>first</li> 
<li>second</li> 
</ol> 

:

function linum2int(input) { 
    input = input.replace(/[^A-Za-z]/, ''); 
    output = 0; 
    for (i = 0; i < input.length; i++) { 
     output = output * 26 + parseInt(input.substr(i, 1), 26 + 10) - 9; 
    } 
    console.log('linum', output); 
    return output; 
} 

function int2linum(input) { 

    var zeros = 0; 
    var next = input; 
    var generation = 0; 
    while (next >= 27) { 
     next = (next - 1)/26 - (next - 1) % 26/26; 
     zeros += next * Math.pow(27, generation); 
     generation++; 
    } 
    output = (input + zeros).toString(27).replace(/./g, function ($0) { 
     return '_abcdefghijklmnopqrstuvwxyz'.charAt(parseInt($0, 27)); 
    }); 
    return output; 
} 

linum2int("aa"); // 27 
int2linum(27); // "aa" 
+0

Btw trong firefox giới hạn trên cho' type = "a" 'danh sách là' 2147483647' hoặc 'fxshrxw';) – jakov

0

Chỉ cần viết xong this code sớm tối nay, và tôi tìm thấy câu hỏi này trong khi tìm kiếm để tìm ra những gì để đặt tên cho điều damn. Đây là (trong trường hợp bất kỳ ai cảm thấy thích sử dụng nó):

/** 
* Convert an integer to bijective hexavigesimal notation (alphabetic base-26). 
* 
* @param {Number} int - A positive integer above zero 
* @return {String} The number's value expressed in uppercased bijective base-26 
*/ 
function bijectiveBase26(int){ 
    const sequence = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    const length  = sequence.length; 

    if(int <= 0)  return int; 
    if(int <= length) return sequence[int - 1]; 


    let index = (int % length) || length; 
    let result = [sequence[index - 1]]; 

    while((int = Math.floor((int - 1)/length)) > 0){ 
     index = (int % length) || length; 
     result.push(sequence[index - 1]); 
    } 

    return result.reverse().join("") 
} 
Các vấn đề liên quan