【问题标题】:Implement a source code that turns numbers into text (C++)实现将数字转换为文本的源代码 (C++)
【发布时间】:2013-05-29 01:24:51
【问题描述】:

不久前我刚开始学习 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 变成“25”。

任何帮助将不胜感激!

【问题讨论】:

  • std::map 是一笔巨大的财富。还要努力寻找模式,当你找到一个时,将它分开。例如,13-19 有一个前缀,然后是“teen”。这意味着您不必为每个人重复“青少年”。
  • 1.谷歌的“开关声明”。 2. 使用映射和字符串连接。这应该足以进一步发展。
  • 这个程序确实结构错了,至少应该是一个switch语句,而不是一堆ifs。至少有礼貌地为您的函数使用正确的命名约定,并让函数return 成为结果,而不是直接输出它。
  • @AJMansfield 提出了另一个好点。你的函数说它返回一个int,但什么也不返回。这是未定义的行为,如果你的编译器没有警告你,是时候提高警告级别了。
  • 您可以通过使用 Wolfram|Alpha API 为您提供答案,“在云端”完成这一切。您只需将号码发送给它,然后从“号码名称”窗格中获取值。其他在线服务可能会做得更好,但 Wolfram|Alpha 是第一个想到的。

标签: c++


【解决方案1】:

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

二十岁以上,我们必须开始更通用的编码。我们必须将创建单词版本分成几部分:

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

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

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

【讨论】:

  • 我几乎(但不完全)确定有比number / 10 % 10 更好的方法来获取下一个数字。
  • @AJMansfield 不是真的,除非您的意思是使用 itoa 将其转换为字符数组并检查字符数组。
  • @AJMansfield 如果您真的想尝试所有性能,您可以将 int 保持为 10 的运行幂,对每个数字位进行乘法运算,然后只进行除法运算。此外,可以预先计算 10 的幂,甚至可以消除该成本以换取一些内存开销。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    有很多解决方案,但由于我认为您想在这里自己实现一些想法(仅适用于整数类型): 首先,我将确定存储字符串所需的 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

    【讨论】:

    • 我很确定日志不适用于负数。 (至少不是你调用的函数)
    • 布尔负数 = number
    【解决方案4】:

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

    例如:

    //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
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多