将3位数字转换为单词C++
我一直在玩数字到单词的游戏,找到了一种简单的方法来做1-99之间的任意两位数将3位数字转换为单词C++,c++,C++,我一直在玩数字到单词的游戏,找到了一种简单的方法来做1-99之间的任意两位数 有没有什么方法可以扩展我当前的代码以允许3位数字和1-999数字,这有多容易?您可以使用递归处理更大的数字。 利用这个程序已经可以处理两位数的事实,用num=num/100解析百位数,并将剩余的r=num%100传递给您创建的函数。 只要稍加努力,您就可以处理任意长度的数字。以下是SQL中的算法。dbo.NumberWord表有两列:Number和WordEn。该表包含数字1到20,然后是30、40、50、60、70、
有没有什么方法可以扩展我当前的代码以允许3位数字和1-999数字,这有多容易?您可以使用递归处理更大的数字。 利用这个程序已经可以处理两位数的事实,用num=num/100解析百位数,并将剩余的r=num%100传递给您创建的函数。
只要稍加努力,您就可以处理任意长度的数字。以下是SQL中的算法。dbo.NumberWord表有两列:Number和WordEn。该表包含数字1到20,然后是30、40、50、60、70、80和90的英文单词。一,二,二十,三十,四十,九十 下面是递归T-SQL函数,该函数用于将1到999000之间的任何整数转换为英文单词:
#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;
}
这应该可以做到:
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
此代码经过测试并正常工作。
如果您愿意,可以进一步扩展它。它使用递归,这使得这非常容易
此代码有效期至99999999。打印百位数字、百字,然后打印上面的其他两位数字。有趣的是,您的代码实际上是从中复制的。我猜你只是在找人帮你做作业?奇怪的是,尽管贴了拷贝,他们还是设法在这篇文章的原始版本中拼错了17个字。关于这个问题已经有了一个代码审查:请不要提供OP的答案。向OP提供信息,让OP思考-
#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;
}