【问题标题】:How to compare a number string and it's reverse to find the next highest palindrome?如何比较一个数字字符串并且找到下一个最高回文是相反的?
【发布时间】:2014-02-17 02:30:59
【问题描述】:

我正在尝试构建一个函数,该函数采用小数点后 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 函数将开始时的询问提示作为参数。如果没有小数的数字与没有小数的反向数字不匹配,则将其增加 0.01。在循环结束之前,我希望它检查前面的数字 +1(因为它是 *​​ 100)是否等于反向,如果是,则写下一个数字。

它不起作用,所以我尝试添加 parseFloat 和 toString 来指定更严格/更明确的转换。我还使用了松散的相等运算符,但它仍然无法正常工作。

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

【问题讨论】:

    标签: javascript string function compare palindrome


    【解决方案1】:

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

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

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

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

    作为最后的评论,您应该永远,永远依赖 Javascript 来终止您的语句 - 您应该始终使用 ; 来终止语句,就像在其他适当的 C 风格语言中一样。忽略 ;-s(即使 Javascript 让你侥幸逃脱)被认为是非常糟糕的做法。

    【讨论】:

    • var ask = prompt("Enter Price"); var a = "" var reverseIt = function (x) { x = (parseFloat(x) * 100).toString(); for (var i = (x.length - 1); i >= 0; i--) { 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 很高兴它有帮助。
    【解决方案2】:

    感谢上面的帮助,我想通了!以下是固定程序的工作原理:

    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。如此有效地循环在循环结束之前找到数字,将其写入然后跳出循环。无论您将小数点放在哪里,这个回文查找器似乎都可以顺利处理大小值。很高兴我让它工作了......这是一次很棒的学习经历!

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2011-10-05
      相关资源
      最近更新 更多