如何比较一个数字字符串,它是相反的,找到下一个最高的回文?

时间:2014-02-17 02:30:59

标签: javascript string function compare palindrome

我正在尝试构建一个带有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),并将其转换回字符串。这比较两个“数字”字符串是多余的吗?我应该使用 Number() 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函数将start的ask提示作为参数。如果没有小数的数字与没有小数的反向不匹配,则将其递增0.01。在循环结束之前,我希望它检查前+1的数字(因为它是* 100)是否等于反向,如果是,则写下一个数字。

它没有用,所以我尝试添加parseFloat和toString来指定更严格/更明确的转换。我也使用了松散的相等运算符,但它仍然无效。

我的问题:这是转换或语法问题还是你不能比较2个函数的输出?我应该比较2个变量,如果是,我如何将 reverseIt 函数中的for循环分配给变量?

2 个答案:

答案 0 :(得分:0)

您的计划存在许多问题。首先,您的reverseIt函数永远不会返回反转值。传递变量x但它永远不会在for循环中更新 - x.substr()创建一个新的字符串实例,但它永远不会被分配回x,因此它的值永远不会改变。事实上,for中的findDrome循环变为无限,因为reverseIt返回undefined

另一个可能的问题是你将浮点数增加1/100,但浮点值没有精确的表示。我不知道这是否真的影响了你的代码(因为它目前永远不会返回正确的值)但是你可能不得不担心。这可能会影响parseFloat(可能会返回与其解析的字符串略有不同的浮点值)。

使用toFixed()会将数字截断为2位小数。然后,您可以将数字转换为字符串并删除小数点字符,而不是在字符串和数字之间来回转换数字。

您可能需要阅读floating-point arithmetic(如果您还不熟悉它)。

作为最后一条评论,您应该从不依赖于Javascript来终止您的语句 - 您应该始终使用;来终止语句,就像其他正确的C风格语言一样。离开; - s(即使Javascript让你逃脱它)被认为是非常糟糕的做法。

答案 1 :(得分: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 函数接受一个参数,将其转换为字符串,并将每个字符反向添加到空字符串(a =“”)。然后将 Var a 作为数字返回。空字符串对于存储反向数字很重要,这也是我的代码以前无法工作的一个重要原因。

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

Var e 以考虑到小数左侧的不同位置值。稍后,这有助于通过在数字的两边添加1来检查数字是否等于其反向。 Var e 计算 var c 的长度(已删除小数的输入值),并找到稍后要添加的10的相应幂。因此,如果您输入 14.40 * 100,那么稍后它会检查 1440 + 1是否等于 0441 + 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 < / strong>即可。因此,循环有效地在循环结束之前找到数字,写入然后突破循环。无论你把小数点放在哪里,这个回文查找器似乎都可以顺利运行,值大小。很高兴我得到了它...这是一个很好的学习经验搞清楚!