防止非整数除法

Prevent non-integer division

本文关键字:除法 整数      更新时间:2023-10-16

我正在写一个Qt应用程序,作为一种爱好,它提示用户使用加、减、乘和除运算符回答基本的算术问题。生成问题,每次正确回答问题时,都会生成新的操作数并使用新的操作符。

在某些情况下,问题可能显示为'4/5'或'3/2',这意味着要输入的答案是非整数值。我设定的一个要求是程序中不能有无理数,也就是说不能有无理数的答案,操作数,运算符等等。

在我的类中,我有一个验证器函数,用于验证生成的每个问题。

void ArQuestion::validate()
{
    int answer = getActualAnswer();
    if ((pOperand2 % 2 != 0) ||
         pOperator == operators::DIVIDE)
    {
        if (static_cast<int>(answer) != answer)
        {
            generate();
        }
    }
}

其中getActualAnswer()检索问题的实际答案。

不幸的是,我的验证器不起作用,估计static_cast技巧也不起作用。当我运行这个程序时,仍然有一些问题会问非理性除法问题(产生非理性答案的问题)。我想要验证器做的是以一种方式运行,以防止问题(仅在除法问题下)提出非理性的问题,例如"3/4"或"7/9"。如果这个问题是不合理的,那么它应该产生一个新的问题。

我的问题是:我有什么算法来防止非整数除法问题被问到?

这应该是相当可靠的,

bool quotient_is_integral(double n, double d)
{
    double dummy;
    return std::modf(n/d, &dummy) == 0.0;
}

您正在寻找的是一种确定除法问题是否返回整数答案的方法,这里有一个小函数可以做到这一点。

#include <iostream>
#include <cmath>
#include <limits>
bool check(double l, double r)
{
   double real_answer = l / r;
   int target_answer = static_cast<int>(real_answer);
   double checked_answer = target_answer;
   if(std::fabs(real_answer - checked_answer) > std::numeric_limits<double>::min())
   {
      std::cout << "Invalid.n";
      return false;
   }
   return true;
}