我刚开始学习如何用C++编程,因为一项任务我已经绝望了。我只允许使用以下操作:+-*/%和括号、int变量和声明,例如a=b;
任务是将整数a和b分开。输出应该是数学/算术正确的四舍五入到下一个整数。我该怎么做?我不能使用if/else、定义新函数等。我真的不知道,我已经尝试了一些方法,但它们并不适用于所有情况(a和b可以都是正整数(。
非常感谢你的帮助!!!!
编辑:由于我们没有了解bool等是什么,我不能使用它。它应该输出,例如5/2=3(四舍五入(7/3=2(四舍五入(
我假设您想要四舍五入到最接近的值,并且.5
将转到下一个更大的整数。并且我们限制为a > 0
和b > 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
的和的典型实现,这避免了溢出。