2014-02-17 57 views
1

我試圖建立一個函數,需要2個小數點的價格,並找到下一個最高的迴文。我知道還有其他幾種方法可以解決這個問題,但我很好奇爲什麼我的方法無法正常工作。我是JS新手,所以這可能是一個簡單的問題。任何建議都會很棒。如何比較數字字符串,並找到下一個最高迴文數?

我打破了它成小塊用的什麼,我希望它做如下解釋:

var ask = prompt("Enter a price"); 

var reverseIt = function (x) { 

    x = (parseFloat(x) * 100).toString(); 

    for (var i = (x.length - 1); i >= 0; i--) { 
     x.substr(i, 1); 
    } 
    return 
}; 

reverseIt功能需要一個參數去掉小數點(* 100)和反轉的數量。

var removeDec = function (j) { 

    return (parseFloat(j) * 100).toString(); 

} 

removeDec函數需要一個參數,消除了小數點(* 100),並將其轉換回爲字符串。這是多餘的比較兩個「數字」字符串?我應該使用數字()String()函數嗎?

var findDrome = function (i) { 

    for (var i; removeDec(i) != reverseIt(i); i += (1/100)) { 

     if ((removeDec(i) + 1).toString() == reverseIt(i)) { 

      document.write(i + (1/100)); 
     } 
    } return 
}; 

findDrome(ask); 

findDrome函數將開始處的ask提示符作爲參數。如果沒有小數的數字與沒有小數的相反不匹配,則將其增加0.01。在循環結束之前,我希望它檢查先前的數字+1(因爲它是* 100)是否等於反向,如果是這樣,則寫下一個數字。

它沒有工作,所以我嘗試添加parseFloat和toString來指定更嚴格/更明確的轉換。我也使用了鬆散的相等運算符,但它仍然不起作用。

我的問題:這是一個轉換或語法問題還是你不能比較2個函數的輸出?我是否應該比較2個變量,如果是這樣,我如何將reverseIt函數中的for循環分配給變量?

回答

0

您的程序有許多問題。首先,你的reverseIt函數永遠不會返回一個反轉的值。變量x已傳入,但從未在for循環中更新 - x.substr()創建了一個新的字符串實例,但它從未分配回x,因此其值永遠不會更改。實際上,您的for循環在findDrome變得無限,因爲reverseIt返回undefined

另一個可能的問題是您將浮點數按1/100遞增,但浮點值沒有精確表示。我不知道這是否實際上影響了你的代碼(因爲它目前從來沒有返回正確的值),但這是你可能不必擔心的。這可能會影響parseFloat(這可能會返回一個與它解析的字符串略有不同的浮點值)。

使用toFixed()會將該數字截斷爲2個十進制數字。然後可以將該數字轉換爲一個字符串併除去小數點字符,而不是在字符串和數字之間來回轉換數字。

你可能想要閱讀floating-point arithmetic(如果你還不熟悉它)。

作爲最後的評論,你應該永遠,永遠依賴於JavaScript終止您的發言 - 你應該總是使用;在其他適當的C風格的語言來終止的聲明等。離開;-s(即使Javascript讓你放棄它)被認爲是非常糟糕的做法。

+0

var ask = prompt(「Enter Price」); (x){ x =(parseFloat(x)* 100).toString(); (var i =(x.length-1); i> = 0; i--){ \t a =(a + String(x.substr(i,1))); } return a; }; var b = parseFloat(reverseIt(ask)); var removeDec = function(j){ return(parseFloat(j)* 100)。的toString(); } var c = parseFloat(removeDec(ask)); if(b == c){document.write(「Palindrome」); } else { document.write(「Not a Paindrome!」); }'謝謝你的幫助!找出最上面的部分,現在我需要閱讀浮點算法,我知道了! – user3211460

+0

@ user3211460很高興​​有幫助。 – xxbbcc

0

感謝上面的幫助,我明白了!以下是固定程序的工作原理:

var ask = prompt("Enter a price to find the next palindromic price"); 

var removeDec = function (j) { 
    return parseInt(j * 100); 
}; 

var c = removeDec(ask); 

這會提示價格並將其乘以100以除去小數點並避免浮點運算。 parseInt刪除任何小於百分之一的小數。

var reverseIt = function (x) { 
    var a = "" 
    x = x.toString(); 
    for (var i = (x.length - 1); i >= 0; i--) { 
     a = (a + String(x.substr(i, 1))); 
    } 
    return Number(a); 
}; 

var b = reverseIt(c); 

reverseIt函數需要一個參數,將其轉換爲字符串,並增加了每一個字符在反向爲空字符串(α=「」)。 Var a然後作爲數字返回。空字符串對於存儲反向數字很重要,這也是我的代碼之前沒有工作的重要原因。加入

var e = Math.pow(10, (String(c).length - 1)); 

瓦爾ë考慮到不同的地方的值在小數點的左邊。稍後,這有助於通過在數字的兩側添加1來檢查數字是否與其相反。 變量e計數var c(輸入的值除去十進制值)的長度,並找到適當的冪以便稍後添加。所以,如果你輸入14.40 * 100再後來它會檢查是否 + 1等於 + 1000 ..或10^3。爲了退出循環,此測試很重要。這是我的代碼之前失敗的地方,因爲我沒有考慮將反向號碼添加到帳戶中,我試圖添加不可預測的小數。

if (c == b) { 
    document.write("$" + (c/100) + "... This price is already palindrome!") 
} else { 

    for (c; c !== b; c++) { 
     b = reverseIt(c); 
     if ((c + 1) == (b + e)) { 
      document.write("The next palindromic price is $" + ((Number(c) + 1)/100)); 
      break; 
     } 
    } 
} 

在這裏,如果原始數和它的反向不相等則循環開始該遞增1的值,直到輸入數+ 1等於反轉數+ E。因此,循環有效地在循環結束之前找到數字,寫入數據然後跳出循環。這個迴文尋找器似乎可以順利地處理大大小小的數值,無論你把小數點放在哪裏。很高興我得到了它的工作......這是一個很好的學習經驗搞清楚了!

相關問題