我正在编写一个Qt应用程序作为一种兴趣,它提示用户使用add,minus,multiply和divide运算符来回答基本算术问题。生成问题,每次正确回答问题时,都会生成新的操作数并使用新的操作符。
在某些情况下,可能会出现一个问题:' 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
诀窍也不起作用。当我运行该程序时,仍有一些问题会提出不合理的分组问题(产生不合理答案的问题)。我希望验证者做的是以一种方式起作用,以防止问题(仅在分组问题下)无理性地提出问题,例如&#39; 3/4&#39;或者&#39; 7/9&#39;。如果问题不合理,那么它应该产生一个新问题。
我的问题是:我有什么算法来防止被问到非整数除法问题?
答案 0 :(得分:1)
您正在寻找的是一种确定除法问题是否返回整数答案的方法,这是一个很小的功能。
#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;
}
答案 1 :(得分:1)
这应该相当可靠,
bool quotient_is_integral(double n, double d)
{
double dummy;
return std::modf(n/d, &dummy) == 0.0;
}