将 3 位数字转换为单词C++

Converts 3 digit numbers to words C++

本文关键字:单词 C++ 转换 数字      更新时间:2023-10-16
#include <string>
using namespace std;
int main()
{
    int num,
        leftDigit,
        rightDigit;
    string ones[] = { "Zero",
        "One",
        "Two",
        "Three",
        "Four",
        "Five",
        "Six",
        "Seven",
        "Eight",
        "Nine",
        "Ten",
        "Eleven",
        "Twelve",
        "Thirteen",
        "Fourteen",
        "Fifteen",
        "Sixteen",
        "Seventeen",
        "Eighteen",
        "Nineteen",
    };
    string tens[] = { "Twenty",
        "Thirty",
        "Forty",
        "Fifty",
        "Sixty",
        "Seventy",
        "Eighty",
        "Ninety",
    };
    cout << "Enter a Number " ;
    cin >> num; 
    if (num <=0 || num >=100 )
    {
        cout << "the Number is not Between 1-99" << endl;
    }
    else if (num >= 1 && num <= 19)
    {
        cout << "The Number you have entered is " << ones[num] << endl;
    }
    else if (num >= 20 && num <= 99)
    {
        leftDigit = num / 10;
        rightDigit = num % 10;
        cout << "the Number you have entered is " << tens[leftDigit - 2] << " " << ones[rightDigit] << endl;
    }
    system("PAUSE");
    return 0;
}

我一直在玩数字到单词,并找到了一种简单的方法来做 2-1-99 的任何数字。

有什么方法可以扩展我当前的代码以允许 3 位数字并允许数字 1-999,这有多容易?

您可以使用递归处理更大的数字。利用该程序已经适用于 2 位数字的事实,用 num = num / 100 解析百位数字,并将余数r = num % 100传递给您创建的函数。只需一点工作,您就可以处理任何长度的数字。

这应该可以解决问题:

#include <string>
#include <iostream>
using namespace std;
string ones[] = { "",
"One",
"Two",
"Three",
"Four",
"Five",
"Six",
"Seven",
"Eight",
"Nine",
"Ten",
"Eleven",
"Twelve",
"Thirteen",
"Fourteen",
"Fifteen",
"Sixteen",
"Seventeen",
"Eighteen",
"Nineteen",
};
string tens[] = { "Twenty",
"Thirty",
"Forty",
"Fifty",
"Sixty",
"Seventy",
"Eighty",
"Ninety",
};
string hundred = "Hundred";
string thousand = "Thousand";
string million = "Million";
string intToWord(int num)
{
    if (num >= 1000000 && num < 1000000000)
    {
        int first = num / 1000000;
        return intToWord(first) + " " + million + " " + intToWord(num - first * 1000000);
    }
    else if (num >= 1000)
    {
        int first = num / 1000;
        return intToWord(first) + " " + thousand + " " + intToWord(num - first * 1000);
    }
    else if (num >= 100)
    {
        int first = num / 100;
        return ones[first] + " " + hundred + " " + intToWord(num - first * 100);
    }
    else if (num >= 20)
    {
        int leftDigit = num / 10;
        int rightDigit = num % 10;
        return tens[leftDigit - 2] + " " + ones[rightDigit];
    }
    else if (num >= 0)
    {
        return ones[num];
    }
    return "number too large or smaller than 1";
}
int main()
{
    int num;
    cout << "Enter a Number ";
    cin >> num;
    cout << endl << intToWord(num) << endl;
    system("PAUSE");
    return 0;
}

此代码经过测试并正常工作。如果需要,您可以进一步扩展它。它使用递归,这使得这变得非常容易。

此代码一直有效到 999999999。

这是SQL中的算法(抱歉(。dbo.NumberWord表有 2 列:NumberWordEn 。该表包含数字 1 到 20 的英语单词,然后是 30、40、50、60、70、80 和 90。(一,二,...二十,三十,四十,...,九十(。

下面是递归 T-SQL 函数,调用该函数以将 1 到 999,000 之间的任何整数转换为英语单词:

CREATE FUNCTION [dbo].[fnNumberToEnglish] (@Number int)
    RETURNS nvarchar(1024)
AS
BEGIN   
    DECLARE
        @English nvarchar(1024) = 
            (SELECT CASE
                WHEN @Number = 0 THEN ''
                WHEN @Number BETWEEN 1 AND 19 THEN
                    (SELECT WordEn FROM dbo.NumberWord
                    WHERE Number = @Number)
                WHEN @Number BETWEEN 20 AND 99 THEN
                    (SELECT WordEn FROM dbo.NumberWord
                    WHERE (Number / 10) = @Number / 10) + N'-' + dbo.fnNumberToEnglish(@Number%10)
                WHEN @Number BETWEEN 100 AND 999 THEN
                    (dbo.fnNumberToEnglish(@Number / 100)) + N' Hundred ' + dbo.fnNumberToEnglish(@Number%100)
                WHEN @Number BETWEEN 1000 AND 999999 THEN
                    (dbo.fnNumberToEnglish(@Number / 1000)) + N' Thousand ' + dbo.fnNumberToEnglish(@Number%1000)
                ELSE
                    N' INVALID INPUT' 
            END);
    SET @English = RTRIM(@English);
    IF RIGHT(@English,1) = '-' BEGIN
        SET @English = RTRIM(LEFT(@English, LEN(@English) - 1));
    END
    RETURN @English;
END