0

我刚刚开始学习 C++。我正在阅读 Jumping into C++ 。该问题与第 7 章问题 1 相关:

实现将数字转换为文本的源代码。

这是我到目前为止所做的:

#include <iostream>
#include <string>

using namespace std;

int LessThen20 (int i);

int main () {
    int i = 1;
    cout << "please input a number: \n";
    cin >> i;
    if (i < 20) {
        cout << LessThen20(i);
    }

    if ( i >= 20 && i < 30) {
        cout <<"Twenty " ??
    }
}

int LessThen20 (int i) {
    if (i == 0) {
        cout << "zero" <<endl;
    }

    if ( i == 1) {
        cout << "one"; <<endl;
    }

    if (i == 2) {
        cout << "two"; <<endl;
    }

    if ( i == 3) {
        cout << "three"; <<endl;
    }

    if (i == 4) {
        cout << "four"; <<endl;
    }

    if ( i == 5) {
        cout << "five"; <<endl;
    }

    if (i == 6) {
        cout << "six"; <<endl;
    }

    if ( i == 7) {
        cout << "seven"; <<endl;
    }

    if (i == 8) {
        cout << "eight" <<endl;
    }

    if ( i == 9) {
        cout << "nine"; <<endl;
    }

    if (i == 10) {
        cout << "ten"; <<endl;
    }

    if ( i == 11) {
        cout << "eleven"; <<endl;
    }

    if (i == 12) {
        cout << "twelve"; <<endl;
    }

    if ( i == 13) {
        cout << "thirteen"; <<endl;
    }

    if (i == 14) {
        cout << "fourteen"; <<endl;
    }

    if ( i == 15) {
        cout << "fifteen"; <<endl;
    }

    if (i == 16) {
        cout << "sixteen"; <<endl;
    }

    if ( i == 17) {
        cout << "seventeen"; <<endl;
    }

    if (i == 18) {
        cout << "eighteen"; <<endl;
    }

    if ( i == 19) {
        cout << "nineteen"; <<endl;
    }
}

只要输入的数字小于 20,我的程序就可以工作。但我不知道如何将数字 25 变成“二十五”。

任何帮助将不胜感激!

4

4 回答 4

6

二十以下的一切都是特例。但是,与其拥有巨大的 if 链,不如拥有一个包含"zero", "one", "two",etc 的数据结构并在该数据结构中建立索引。(例如向量、映射或数组。如果你不知道如何使用这些,我建议你学习,因为数据结构在所有编程语言中都非常有用,你会想学习它们)。

超过 20 岁,我们必须开始更通用的编码。我们必须将创建单词版本分成几部分:

1)获取单位列。您可以使用数字 % 10 仅获取单位,因为 % 10 获取除以 10 后的余数。您可以使用单位编号从之前的零、一、二等数据结构中索引并获取要打印的内容。

2)获取十列。类似的想法 - (number / 10) % 10。现在将十列索引到一个数据结构中,如“”、“十”、“二十”、“三十”……在 0、1、2、3...

3) ... 对于每个更高的列,依此类推。

于 2013-05-29T01:29:35.757 回答
4

如果第二个数字大于 2,您只需按照与“二十”相同的方式连接,但与三十、四十等连接。

相同的方法可以应用于数百、数千等。

最好将“前缀”存储在某种可以直接索引的数组中(例如,myTensArray[3] 给出“30”)。

于 2013-05-29T01:29:53.100 回答
1

有很多解决方案,但由于我认为您想在这里自己实现一些想法(仅适用于整数类型):首先,我将确定存储字符串所需的 char 数组的长度。位数可以由下式确定

int digits = ((int)log10(number))+1; //+1 if number is negative

接下来你想把你的号码分成数字

for(int i = digits - 1; number; i--){  //until number is 0
//charFromDidgit(...) returns the char for a nuber between 0 and 9 (e.g. '3' for 3) 
yourCharArray[i] = charFromDigit(number%10);
number /= 10;
}

不要忘记在数组末尾附加终止 0

于 2013-05-29T01:37:45.720 回答
-1

如果您想要一种仅使用原始概念的方法,您可以简单地使用一个循环来检查数字是否超过某个值,然后根据它的大小从该数字中减去。每次循环运行后,使用一个变量来保存从数字中减去的次数。

例如:

//Your number is greater than 1 billion
while ( x > 1000000000 ) { 
billions += 1 
x -= 1000000000 
}

//Your number is greater than 1 million
while ( x > 1000000 ) { 
millions += 1 
x -= 1000000
}

//Your number is greater than 1 thousand
while ( x > 1000 ) { 
thousands += 1 
x -= 1000
}

等等。然后你把它变成了一个小得多的问题,因为你现在只需要处理三位数字(你可以使用上面完全相同的步骤,只是几十和几百)。您还可以使用模数运算符。它更有效,但更难实施。

于 2013-12-16T16:21:39.493 回答