我想做以下事情:
我使用变量int a
来保持控制台的输入,然后执行以下操作:
int b = a / 16;
当a
为64或32时,我得到4或2.但如果a
为63,我希望得到4,但我得到3.在C中是否有任何方法可以获得四舍五入的价值?
修改即可。更多细节:
rang 1 to 16 should get 1,
rang 17 to 32 should get 2,
rang 33 to 48 should get 3,
rang 49 to 64 should get 4
答案 0 :(得分:4)
当您使用带有两个/
参数的除法运算符int
时,它将返回表示截断结果的int
。
您可以在不使用浮点数的情况下获得向上舍入的除法,如下所示:
int a;
int den = 16;
int b = (a + den - 1) / den;
这将为您提供您所期望的:
a ∈ [0], b = 0 / 16 = 0,
a ∈ [1, 16], b = [16, 31] / 16 = 1,
a ∈ [17, 32], b = [32, 47] / 16 = 2,
a ∈ [33, 48], b = [48, 63] / 16 = 3,
a ∈ [49, 64], b = [64, 79] / 16 = 4,
...
请注意,仅当a
和b
为正数时才有效,并注意a + den
可能溢出。
如果怀疑a + den
可能溢出,那么您可以使用此表达式的另一个版本:
int b = (a - 1) / den + 1;
唯一的缺点是,1
时会返回a = 0
。如果这是一个问题,您可以添加以下内容:
int b = (a - 1) / den + 1 - !a;
请注意,您也可以采用相同的方式处理a
的负值(从零开始舍入):
int b = (a > 0) ? (a - 1) / den + 1 : (a - den + 1) / den;
答案 1 :(得分:2)
C中的整数除/
不执行 rouding ,而是执行截断。
答案 2 :(得分:1)
<强>解决方案强>
int ans, newNo;
int no = 63; // Given number
int dNo = 16; // Divider
newNo = (no % dNo) ? (dNo - (no % dNo) + no) : no; // Round off number
ans = newNo / dNo;
优化解决方案
ans = (no / dNo) + !!(no % dNo);
答案 3 :(得分:0)
您可以尝试使用以下
int b = (int)ceil((double)a/16);
答案 4 :(得分:0)
无论你在尝试什么,概念都不正确,但如果你想要在问题中说出相同的结果,你可以尝试在math.h中定义的标准函数double ceil(double x)
向上舍入x,返回不小于x的最小整数值。
答案 5 :(得分:0)
获得所需内容的最简单方法是使用浮点数。
#include <math.h>
#include <stdio.h>
int main(void)
{
double a = 63.0;
double b = 16.0;
printf("%d", (int) round(a / b));
return 0;
}
从浮点数转换为int时要小心注意,反之亦然。例如,round(63/16)
不正确。它返回一个double,但什么也没有,因为文字63和16是整数。在将值传递给函数之前完成除法。正确的方法是确保一个或两个操作数的类型为double:round(63.0 / 16.0)
答案 6 :(得分:0)
由于C int除法总是向零舍入,因此可以使用一个简单的技巧使其均匀舍入是在舍入发生之前将数字加“0.5”。例如,如果要除以32,请使用
x = (a+16)/32;
或更一般地,对于a / b,其中a和b都是正的:
x = (a+b/2)/b;
不幸的是,负数使其复杂化,因为如果结果为负,那么您需要减去0.5而不是添加它。如果您在编写代码时已经知道它会是正面的还是负面的,那就没问题了,但是如果要处理正面和负面的答案,它就会变得混乱。你可以这样做......
x = (a+((a/b>0)?1:-1)*(b/2)) / b;
但是在那个阶段它开始变得非常复杂 - 只是强制转换为浮动并使用round
函数。
-
[编辑]正如扎金斯特所指出的那样,虽然问题是“圆”值,但实际给出的例子需要ceil
。使用整数的方法是:
x = (a+b-1)/b;
再次,如果答案可能是否定的,那就变得复杂了:
x = (a+((a/b>0)?1:-1)*(b-1)) / b;
如果有人感兴趣的话,我会留下我原来的答案,甚至是四舍五入。