C++:用BASIC运算除法后,如何进行算术四舍五入



我刚开始学习如何用C++编程,因为一项任务我已经绝望了。我只允许使用以下操作:+-*/%和括号、int变量和声明,例如a=b;

任务是将整数a和b分开。输出应该是数学/算术正确的四舍五入到下一个整数。我该怎么做?我不能使用if/else、定义新函数等。我真的不知道,我已经尝试了一些方法,但它们并不适用于所有情况(a和b可以都是正整数(。

非常感谢你的帮助!!!!

编辑:由于我们没有了解bool等是什么,我不能使用它。它应该输出,例如5/2=3(四舍五入(7/3=2(四舍五入(

我假设您想要四舍五入到最接近的值,并且.5将转到下一个更大的整数。并且我们限制为a > 0b > 0

假设你已经从简单的整数算法中得到了一半情况的正确答案(因为它总是向下取整(。为了使另一半正确,你可以将分子移动分母的一半:

#include <iostream>
int divide(int a, int b){
return (a+b/2) / b;
}
void test(int a, int b){
std::cout << a << " / " << b  << " = " << (double)a/b << " == " << divide(a,b) << "n";
}
int main(){
for (int i=0;i<20;++i){
test(i,3);
}
}

输出:

0 / 3 = 0 == 0
1 / 3 = 0.333333 == 0
2 / 3 = 0.666667 == 1
3 / 3 = 1 == 1
4 / 3 = 1.33333 == 1
5 / 3 = 1.66667 == 2
6 / 3 = 2 == 2
7 / 3 = 2.33333 == 2
8 / 3 = 2.66667 == 3
9 / 3 = 3 == 3
10 / 3 = 3.33333 == 3
11 / 3 = 3.66667 == 4
12 / 3 = 4 == 4
13 / 3 = 4.33333 == 4
14 / 3 = 4.66667 == 5
15 / 3 = 5 == 5
16 / 3 = 5.33333 == 5
17 / 3 = 5.66667 == 6
18 / 3 = 6 == 6
19 / 3 = 6.33333 == 6

我试着想象一下这里发生了什么,实际上很简单:

对于除噪器3:

a          0   1   2   3   4   5   6  
a/3        000000000   111111111   222222    <- integer arithmetics
round(a/3) 00000   111111111   2222222222    <- desired result
a/3==n.5         ^           ^  

对于分母b

a          0   1   2  ... b/2   ...   b-1   b   b+1    
a/b        000000000000000000000000000000   111111111111   
round(a/3) 000000000000   111111111111111111111111111111
a/b==n.5                  ^            

对于分母b=3,我们需要将1的偏移量添加到a以获得正确的结果。通常,我们需要添加b/2的偏移量。我希望这些表格不仅仅是文字。

请注意,a+b/2可能会发生溢出。还有其他数学上等效的epxression不会那么容易溢出。作为确定适合int的最终结果,我们可以使用unsigned进行中间添加:

int div = (static_cast<unsigned>(a) + static_cast<unsigned>(b/2)) / b;

对于unsigned可以存储任意两个正int的和的典型实现,这避免了溢出。

最新更新