【问题标题】:Long condition C++ [closed]长条件 C++ [关闭]
【发布时间】:2014-06-18 01:15:02
【问题描述】:
y=20;
x=32640;
b=1920;
if (
    n > (x*1) && n < ((x*1)+(b))||
    n > (x*2) && n < ((x*2)+(b))||
    n > (x*3) && n < ((x*3)+(b))||
    n > (x*4) && n < ((x*4)+(b))||
    n > (x*5) && n < ((x*5)+(b))||
    n > (x*6) && n < ((x*6)+(b))||
    n > (x*7) && n < ((x*7)+(b))||
    n > (x*8) && n < ((x*8)+(b))||
    n > (x*9) && n < ((x*9)+(b))||
    n > (x*10) && n < ((x*10)+(b))
    ){y = 40;}

在 C++ 中是否有更快的方法来执行此操作,因为我只在 32640 之后为每个条件增加数字?

(性能更快)

【问题讨论】:

  • 听起来余数运算符 (%) 会在这里救场。
  • @BENZ.404 我没有否决您的问题,但您的代码应该使用常量以提高可读性。
  • 这个问题似乎是题外话,更适合codereview.stackexchange.com,因为它是关于寻找更好的方法来执行特定任务。
  • 如果数字从32640 更改为另一个值并替换每个出现的值,你忘记了怎么办?
  • 代码中的幻数导致难以破译和维护代码。至于优化问题,你首先要知道你的编译器自己的优化把它变成了什么。

标签: c++ conditional-statements increment


【解决方案1】:

我不知道这个解决方案是否更高效,但也许它更具可读性和更容易编码:

#include <iostream>
#include <cstdlib>

int main()
{
    const int magicNumber = 32640;
    const int maxOffset = 1920;

    int n;
    std::cin >> n;

    int y = 20;

    const std::div_t divresult = std::div(n, magicNumber);

    if (divresult.rem > 0 && divresult.rem < maxOffset &&       // (#1)
            divresult.quot >= 1 && divresult.quot <= 10)    {   // (#2)
        y = 40;
    }

    std::cout << "y: " << y << std::endl;

    return 0;
}

编辑:

在这里,我利用了这样一个事实,即要使您的条件为真,您要测试的变量 (n) 必须介于 32640 或 magicNumber 的倍数以及该数字的倍数加上一些偏移量 ( maxOffset)。这是将变量除以magicNumber 的余数,参见。 (#1)。

但这并非对每个整数都有效,而仅对某些倍数有效,如您原始解决方案中的 || 所表示的那样。在我的解决方案中,这由商表示,参见。 (#2)。

在编写这个答案时,我了解到有一个函数std::div 可以一步计算这两个并以std::div_t 类型的结构返回它们,因此您可以在条件中使用这两个成员。 Here你可以找到更多关于这个功能的信息。

【讨论】:

  • 我看不懂那个家伙,但还是谢谢你
  • 对不起,你为什么看不懂呢?
  • 你真的应该描述代码的作用以及它是如何完成的。
  • @CaptainObvlious 提供了解释,感谢您的提示。
  • 黑鸟你太聪明了,我的脑疼,我需要一些方法让我的智商更高,这样我才能想象你说的话......
猜你喜欢
  • 1970-01-01
  • 2011-09-10
  • 2012-12-23
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多