【问题标题】:Having trouble with simple arithmetic in C++在 C++ 中遇到简单算术问题
【发布时间】:2012-02-01 15:08:37
【问题描述】:

所以,这就是我要实现的逻辑:

date120 = date5;
date90 = min(date90,date120);
date60 = min(date60, date90, date120);
date30 = min(date30,date60,date90,date120);

min 函数找到最小的正整数。

这就是我循环它的方式:

 if(strStatus != "5" && date5 >= 0)
{
    date120 = date5;
    COUT<<"date30 is "<<date30<<" and date60 is "<<date60<<" and date120 is "<<date5<<" and date90 is "<<date90<<ENDL;
    if((date120 < date90) && (date120 >= 0))
    {
        date90 = date120;
        COUT<<"and date90 is "<<date90<<ENDL;
        if((date90 < date60) && (date90 >= 0))
        {
            date60 = date90;
            COUT<<"and date60 is "<<date60<<ENDL;
            if((date60 < date30) && (date60 >= 0))
            {
                date30 = date60;
                COUT<<"and date30 is "<<date30<<ENDL;
            }
        }
        if((date60 < date30) && (date60 >= 0))
            date30 = date60;
    }
    if((date90 < date60) && (date90 >= 0))
    {
        date60 = date90;
        COUT<<"and date60 is "<<date60<<ENDL;
        if((date60 < date30) && (date60 >= 0))
            date30 = date60;
    }
    if((date60 < date30) && (date60 >= 0))
    {
        date30 = date60;
        COUT<<"and date30 is "<<date30<<ENDL;
    }
    COUT<<"Because there was a 5 and date30 is "<<date30<<" and date60 is "<<date60<<ENDL;
}

日志中的输出如下所示:

date30 is -1 and date60 is -1 and date120 is 15 and date90 is -1
Because there was a 5 and date30 is -1 and date60 is -1

我的逻辑有问题吗?我错过了一些逻辑明智的东西吗?有没有更简单的方法来做到这一点?

【问题讨论】:

  • 您的代码中没有“其他”情况,您确定控制流程正确吗?这段代码真的很难分析,因为有很多分支,而且你的数据如何在它们之间流动并不明显。我会说你应该重构代码;你有一个很好的方式来描述它应该如何工作,所以只需逐字翻译它:定义一个“positiveMin”函数并从那里继续。
  • 什么是COUTENDL?你的意思是std::coutstd::endl
  • 是的,它们是相同的 std::cout 和 std::endl

标签: c++ algorithm logic


【解决方案1】:

关于@Rob 的回答,他需要将 min 限制为最小的整数,所以我建议你实现一个自定义 min 函数,例如

int minpos( int x, int y ) {
    return x <= 0 ? y : ( y <= 0 ? x : std::min( x, y ) );
}

然后使用@Rob 的建议:

date120 = date5;
date90 = minpos( date90, date120 );
...

别忘了#include

我假设如果两个数字都是非正数,则返回哪一个并不重要。

【讨论】:

    【解决方案2】:

    首先,您需要一个具有您描述的行为的min 函数:

    // If only one of a,b is non-negative, return it.
    // if both of a,b are non-negative, return the lesser
    // untested
    int myMin(int a, int b) {
      if(b < 0)
        return a;
      if(a < 0)
        return b;
      if(b < a)
        return b;
      return a;
    }
    

    那么你的代码就变得微不足道了:

    // untested
    date120 = date5;
    date90 = myMin(date90, date120);
    date60 = myMin(date60, date90);
    date30 = myMin(date30, date60);
    

    【讨论】:

      【解决方案3】:

      除其他外,您的代码不会执行任何操作,因为 date90 为 -1,因此小于 date120。 所以第一个 if 没有做任何事情,然后他们就没有什么可做的了。

      其他 if 语句都存在与第一个相同的问题。

      【讨论】:

        【解决方案4】:

        你写的相当于:

        date120 = date5;
        date90 = min(date90, date120);
        date60 = min(date60, date90);
        date30 = min(date30, date60);
        

        我从您的代码 (&gt;= 0) 中假设您的意思是非负数,而不是正数。

        我想我会这样写:

        template <typename T>
        T min_non_negative(T t1, T t2)
        {
            return(std::min(t1 >= 0 ? t1 : t2, t2 >= 0 ? t2 : t1));  // Let the compiler do this in the best way for my platform.
        }
        
        date120 = date5;
        date90 = min_non_negative(date90, date120);
        date60 = min_non_negative(date60, date90);
        date30 = min_non_negative(date30, date60);
        

        【讨论】:

          猜你喜欢
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-24
          • 1970-01-01
          相关资源
          最近更新 更多