-3
function convertToRoman(num) { 
    //seperate the number in to singular digits which are strings and pass to array. 
    var array = ("" + num).split(""), 
     arrayLength = array.length, 
     romStr = ""; 

    //Convert the strings in the array to numbers 
    array = array.map(Number); 

    //Itterate over every number in the array 
    for (var i = 0; i < array.length; i++) { 

    //Calculate what power of ten the digit is by minusing it's index from the array length and passing it to variable "tenToPowerOf" 
    var tenToPowerOf = arrayLength - array.indexOf(array[i]) - 1, 
     low = "", 
     mid = "", 
     upp = ""; 

    //Set the low, mid and high variables based on their tenToPowerOf value 
    switch (tenToPowerOf) { 
    case 0: 
     low = "I"; 
     mid = "V"; 
     upp = "X"; 
     break; 
    case 1: 
     low = "X"; 
     mid = "L"; 
     upp = "C"; 
     break; 
    case 2: 
     low = "C"; 
     mid = "D"; 
     upp = "M"; 
     break; 
    case 3: 
     low = "M"; 
     mid = "¯V"; 
     upp = "¯X"; 
     break; 
    } 

    //Check for digit value and add it's Roman Numeral value (based on it's power from the above switch statement) to romStr 
    //The problem is, switch "remembers" the value of low, mid and high from the last time it itterated over the number. Thus 99 becomes "XCXC" and not "XCIX". 
    switch (array[i]) { 
    case 1: 
     romStr += low; 
     break; 
    case 2: 
     romStr += low.repeat(2); 
     break; 
    case 3: 
     romStr += low.repeat(3); 
     break; 
    case 4: 
     romStr += low + mid; 
     break; 
    case 5: 
     romStr += mid; 
     break; 
    case 6: 
     romStr += mid + low; 
     break; 
    case 7: 
     romStr += mid + low.repeat(2); 
     break; 
    case 8: 
     romStr += mid + low.repeat(3); 
     break; 
    case 9: 
     romStr += low + upp; 
     break; 
    case 10: 
     romStr += upp; 
     break; 
    default: 
     break; 

    } 

    } 
    //return array; 
    return romStr; 
} 

convertToRoman(99); 
  • Evet, payımı payımı sormadan önce ilgili bir yanıt aramak için harcadım (1.5+ saat).
  • İşlev, sayıları Romen Rakamlarına dönüştürür.Neden bu JavaScript anahtar ifadesi (for döngüsünün içinde), önceki bir iterasyondan gelen değerleri saklıyor?

    • O on (veya uzunluğuna ilişkin pozisyonun Buradaki sayı gücüne dayalı bir dizi Sonra
    • için daha sonra basamak
    • dönüştürür için kendisine
    • Splitleri sayısını geçti bir sayı argüman alır sayı) düşük orta ve yüksek değerleri
    • olarak ayarlar. Bu değerler daha sonra Romen Rakamları tarafından dikte edilen sıraya uygulanır ve bir dizeye iletilir.
    • Son olarak, dizge döndürülür.
  • Birden çok kez gerçekleşen rakamlara sahip sayılarla çalışır. Bunun nedeni, anahtar kutusunun for döngüsünde bir kereden fazla eşleştirildiğinde, önceki yinelemeden düşük, orta ve yüksek değerleri uygular.

  • Buradaki soru başlığında ama ben de çözmeye çalıştığım soruna bir çözüm sormak istiyorum lütfen.
  • memnuniyetle daha fazla bilgi sağlayacaktır ve JavaScript işlevi kapanışları kullanır ve döngü hala bunun dışında var içeride başka bir deyişle, varsayılan olarak değişkenleri değerlerini sıfırlamak olmadığından her soruyu
+2

Sorunuzda asıl sorunuzla birlikte ilgili kodu koyabilir misiniz? (links die) – Neal

cevap

1

- Yine aynı kodu çalıştırırsanız, j ben döngünün başında null için j (veya başka mantıklı bir değer) kuracak Bunu düzeltmek için 100

başlayacak bana senin sorununun güç hesaplamak için array.indexOf(array[i]) kullanımıdır. Tahmin edin, eğer dizinizde aynı değere iki kez sahipseniz, ilk bulunan dizin, öğenizin endeksi değil.

Geçerli öğenizin dizininin gerçekte ne olduğunu tahmin edin? → i
indexOf'a gerek yoktur.

switch ile ilgisi yoktur.

+0

Sorumu yanıtladığınız ve düzenlediğiniz için teşekkür ederiz. Bu benim problemimi çözdü. – Tom

0

cevap verecektir . Bir for döngü içine var olarak ilan

0

Değişkenler o switch ile ilgisi yoktur, her tekrarında sıfırlanmaz. Konsolun içine

deneyin yapıştırarak bu -

for (var i = 1; i <= 10; i++) 
{ 
    console.log('before', i, j); 
    var j = i * 10; 
    console.log('after', i, j); 
} 

Not ilk döngü, jundefined ve "önce" o bir adım gerisinde her zaman sonra sonra. Öyle görünüyor

for (var i = 1; i <= 10; i++) 
{ 
    var j = null; 
    console.log('before', i, j); 
    j = i * 10; 
    console.log('after', i, j); 
} 
İlgili konular