我正在解决一个问题,其中给出了一个正整数,我必须用单词显示它。
例如,如果数字为2134
,则输出应为"two one three four"
。
如果我使用模数运算符并使用递归技术,我得到从最低有效数字开始的数字,即"four three one two"
我也可以反转数字,然后使用模数运算符,但我正在寻找更好的方法。
什么是解决这个问题的更好方法?。我缺少什么概念?
答案 0 :(得分:4)
我的简单回答:
void printNum(int x)
{
static const char * const num[] = {
"zero ", "one ", "two " , "three ", "four ",
"five ", "six ", "seven ", "eight ", "nine "
};
if (x < 10) {
printf(num[x]);
return;
}
printNum(x / 10);
printNum(x % 10);
}
修改强>
经过一些实验和调整后,我想出了这个版本。 我认为这是我能做的最“纯粹”的递归函数。
void printNum(int x)
{
static const char * const num[] = {"zero ", "one ", "two ", "three ",
"four ", "five ", "six ", "seven ",
"eight ", "nine "};
(x < 10)? printf(num[x]) : (printNum(x / 10), printNum(x % 10));
}
答案 1 :(得分:2)
如果您正在寻找递归解决方案:
void num2word(int n) {
if (n / 10 == 0) {
// print the word for n
}
else {
num2word(n / 10);
// print the word for n % 10
}
}
答案 2 :(得分:2)
寻求纯粹的数学答案,因为我认为这就是你要找的东西:
#include <math.h>
#include <stdio.h>
main() {
long long mynum = 2987612345;
long long firstDigitValue;
int firstDigit;
char *names[] = { "zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine" };
while (mynum > 0) {
firstDigit = (int) (mynum/pow(10,(int)log10(mynum)));
firstDigitValue = firstDigit * pow(10,(int)log10(mynum));
mynum -= firstDigitValue;
printf("%s ", names[firstDigit]);
}
printf("\n");
}
然后运行它会产生:
two nine eight seven six one two three four five
它应该适用于很长时间可以处理的任何大小的数字(在其他语言中,或者在C中使用大数字库,它可以处理任意大的数据)。
现在......我不确定使用log10和pow是最快的。但这是最有趣的: - )
答案 3 :(得分:1)
如果它是一个空终止的char *,那么为什么不这样做:
int i = 0;
while(char[i] != null){
switch(char[i]):
case '1': printf("One "); break;
....
i++;
}
如果它不是char *,请将其转换为char * temp = itoa(number);
答案 4 :(得分:1)
1234 / 1000 => 1
1234 % 1000 => 234 234 / 100 => 2
1234 % 100 => 34 34 / 10 => 3
1234 % 10 => 4
你可以很容易地围绕它建立一个循环,但是使用itoa,sprintf和std::to_string可以更容易。