【问题标题】:Algorithm to trim tenths hundredths thousandths numbers修剪十分之一千分之一数字的算法
【发布时间】:2013-08-12 20:16:35
【问题描述】:

我需要检测我需要显示的哪个词与用户分数相对应。

我有下一个开关:

switch (score) {
        case 0:
            outString = @"String1";
            break;
        case 1:
            outString = @"String2";
            break;
        case 2:
            outString = @"String3";
            break;
        case 3:
            outString = @"String3";
            break;
        case 4:
            outString = @"String3";
            break;
        case 5:
            outString = @"String1";
            break;
        case 6:
            outString = @"String1";
            break;
        case 7:
            outString = @"String1";
            break;
        case 8:
            outString = @"String1";
            break;
        case 9:
            outString = @"String1";
            break;           

        default:
            break;
    }

但是,当分数为 29 或 109 时,我如何使用相同的开关。所以我需要在第一种情况下修剪 20 以获得 9,在第二种情况下我需要修剪 100 以获得 9。

我以前用过这个算法,但我忘了怎么用:(

所以接下来是目标 - 我每次只需要从 0 到 9 的数字,而不需要千分之十分之一的数字。

【问题讨论】:

    标签: c++ objective-c algorithm numbers


    【解决方案1】:

    如果你的单词总是依赖于数字的最后一位,你可以简单地在 switch 条件下使用它(使用模运算符):

    switch (score % 10)
       ...
    

    如果只有 29 和 129 是特殊情况,那么您可以为同一情况使用多个标签:

    case 9:
    case 29:
    case 109:
            outString = @"String1";
            break;
    

    【讨论】:

      【解决方案2】:

      比使用巨大的switch 语句更好的是使用查找表:

      std::string score_string(unsigned int score)
      {
          static const std::string strings = {"String1","String2","String3",...};
          static const int strings_count = 10; //10 strings in the lookup table, for example.
      
          return strings[score % strings_count];
      }
      

      【讨论】:

      • 这个例子的缺点是它会因为分数超出范围而崩溃。开关可能会检测到默认情况下的错误。您也许可以在这个示例中通过范围检查来实现这一点。我也更喜欢 static const char* 因为我希望它是一个编译时间常数。
      • 在这种情况下不会,因为无法达到分数%10的switch中的默认语句
      • @user2672165 首先: 没有缓冲区溢出,因为我们使用以表格长度为模的分数作为索引。 第二: 字符串字面量具有静态存储,与函数的静态局部变量完全一样。所以使用const char* 代替std::string 没有任何好处。 en.cppreference.com/w/cpp/language/string_literal 实际上,如果使用const char*,则会有性能损失:该函数返回一个std::string,因此使用C 字符串会导致在return 语句中调用std::string 的构造函数。如果你使用std::string,...
      • @user2672165 ... 不需要构造函数调用(强制转换),编译器也可以进行复制省略优化。最后,如果你想要一个字符串,请使用 C++ 字符串,而不是 C 字符串。
      • @Manu343726:好的。那么你是对的。但是,当我工作时,例如枚举有使用 switch 语句的规则,因为在这种情况下我对你的解决方案有不好的经验。在这种情况下,您可以按照自己的方式去做。
      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2023-02-21
      • 2021-11-23
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多