首页 > 解决方案 > 使用递归时如何正确添加字符串

问题描述

我需要一个递归算法来拼出从 1 到 21 亿的任何数字。我已经整理好程序的主要部分,但我无法将字符串转换为拼写出来的数字。

例如 1,234,567 次打印:“一千二亿三千四百万五百六十七”

我明白为什么它在“百万”之前打印“千”,我只是找不到正确的“百”、“千”、“百万”和“十亿”工作方式,以便它们正确命令。提前致谢。

static String[] numbers = { "zero", "one", "two", "three", "four", "five",
                            "six", "seven", "eight", "nine", "ten", "eleven",
                            "twelve", "thirteen", "fourteen", "fifteen",
                            "sixteen", "seventeen", "eighteen", "ninteen", "twenty"};

static String[] tens = {"twenty-", "thirty-", "fourty-", "fifty-",
                        "sixty-", "seventy-", "eighty-", "ninety-"};

//static String[] hundreds = {"hundred", "thousand", "million", "billion"};

private static String say(int n) {

    if (n <= 20) {
        return numbers[n];
    } 
    else if (n < 100) { // 99
        return tens[(n / 10) - 2] + say(n % 10); // TODO: fix seventy-zero
    } 
    else if (n < 1000) { // 999 max
        return say(n / 100) + " hundred " + say(n % 100);
    } 
    else if (n < 1000000) { // 999,999 max
        return say(n / 1000) + " thousand " + say(n % 1000);
    } 
    else if (n < 1000000000) { // 999,999,999 max
        return say(n / 1000) + " million " + say(n % 1000);
    }
    else if (n <= 2147483647) { // 2,147,483,647 max integer value
        return say(n / 1000) + " billion " + say(n % 1000);
    }
    else
        return "error";
}

标签: javastringrecursion

解决方案


首先,您应该删除所有else单词。您有 return 语句以在真实条件下终止进一步执行。

第二,例如12_345_678将首先满足n < 1_000_000_000条件。并且将返回say(12_000) + " million " + say(678);正确的一个将是say(12) + " million " + say (345_678);. 要实现它,您需要say(n / 1_000_000) + " million " + say(n % 1_000_000);


推荐阅读