查找一个区间是否包含至少一个没有math.h的整数

时间:2017-05-18 18:07:02

标签: c

对于一个类项目,我需要将一些音频片段分成较小的部分,为此我们提供最小长度和最大长度,以确定这是否可行,我执行以下操作:

a = length/max
b = length/min

在数学上我认为[a,b]至少包含一个⌊b⌋ >= ⌈a⌉的整数,但是我不能将math.h用于floor()和ceil()。由于a和b总是正的,我可以使用类型转换为floor(),但我不知道如何做ceil()。我想过使用((int)x)+1,但这会使整数向上舍入,这会破坏公式。

我想要一种方法来做ceil()来解决我的问题,或者另一种方法来检查一个区间是否包含至少一个整数。

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题是正确的,我想,你可以在这种情况下做ceil(a),然后检查结果是否小于b。因此,例如,对于区间[1.3,3.5],ceil(1.3)将返回2,这适合此区间。

<强> UPD 你也可以做(b - a)。如果它&gt; 1,确保它们之间至少有一个整数。

答案 1 :(得分:1)

您不需要math.h来执行发言权。请查看以下代码:

 int length=5,min=2,max=3; // only an example of inputs.

 int a = length/max;
 int b = length/min;

 if(a!=b){
     //there is at least one integer in the interval.
 }else{
     if(length % min==0 || length % max==0 ){
        //there is at least one integer in the interval.
     }else{
        //there is no integer in the interval.
     }
 }

上述示例的结果将是间隔中有一个整数。

您还可以在不使用math.h的情况下执行ceil:

int a;
if(length % max == 0){
     a = length / max;
}else{
     a = (length / max) + 1;
}

答案 2 :(得分:1)

如果您发现自己编程Apple Basic或支持浮点数学的任何其他语言,编程中会有一个通用技巧。

您可以通过添加,然后截断来“舍入”数字,如下所示:

x = some floating value
rounded_x = int(x + roundoff_amount)

其中roundoff_amount是最低分数与舍入之间的差异,以及1。

所以,要以.5为圆,你的round_off将是1 - .5 = .5,你会做int(x + .5)。如果x是.5或.51那么结果变为1.0或1.01而int()将其变为1.显然,如果x更高,那么你仍然会舍入到1,直到x变为1.5,当舍入将它带到2.要从.6开始向上舍入,您的舍入金额将为1 - .6 = .4,您将执行int(x + .4)等。

你可以做类似的事情来获得ceil行为。将roundoff_amount设置为0.99999 ...并进行回合。您可以选择您的值以提供“附近”窗口,因为浮点数具有一些固有的不准确性,可能会阻止在添加分数后获得完整的整数值。