更快的算法来计算一个范围内的特定整数可以分割多少个数字

时间:2014-11-06 10:48:37

标签: c++

int a,b,c,d=0;
cin>>a>>b>>c;
for (int i=a;i<=b;i++)
 {
 if (i%c==0){d++;}
 }
cout<<d;

因此,这是代码,a..b是数字范围,c是除数,d计算c的倍数。例如,当a=5, b=15, c=3d等于4时,因为“6,9,12,15”是5到15之间的倍数。 我需要找到更快的方法来做到这一点,任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:6)

一种方法就是这样做(不需要循环):

int lower = (a + c - 1) / c; // find lowest divisor (round up)
int upper = b / c;           // find higher divisor (round down)
d = upper - lower + 1;       // get no of divisors

对于您的示例案例,lower将为2,upper将为5,d等于4。

答案 1 :(得分:0)

一个未经测试的头顶算法,找到正整数的所有正确除数......

让你想要找到除数的数字为N

  1. i = 2
  2. 如果N % i == 0,则您有两个除数:iN/i。将这些添加到除数列表(或计数)
  3. 如果i > sqrt(N),则完成,否则设置i = i + 1并转到(2)
  4. 例如,如果N = 24,那么这会给你

    i = 2 => 2, 12
    i = 3 => 3, 8
    i = 4 => 4, 6
    sqrt(24) = 4.90, so finish
    

    (我知道这个算法并没有严格符合您的要求,但它应该很容易适应。)

答案 2 :(得分:0)

而不是检查范围内的每个数字,你可以这样。

在最大数量内查找除数,然后在最小数量内。减法后你会得到理想的结果。例如: -

让我们说范围是[5,15]。

15/3 = 5;  //within max number.
5/3 = 1;   //within min number.

result = 5-1 = 4;

注意: - 您必须处理范围内的边界才能获得正确的结果。