解决数字可分性的最快方法

时间:2017-07-21 18:56:21

标签: c++ c algorithm

我有一个程序,其中输入4个数字n,a,b,c

存在多少小于或等于n且可被a,b或c整除的数字。

示例输入案例 - 15 2 3 5 产量 11

这里n = 15,a = 2,b = 3,c = 5可被a,b或c整除的数字是2,3,4,5,6,8,9,10,12, 14,15即11个数字,因此输出为11

我尝试过这个解决方案,但时间已超过

#include<stdio.h>

long long divisibilty (long long a, long long c, long long b, long long n ) {
    long long temp, min,count = 0,i;
    temp = (a < b)    ? a : b;
    min =  (c < temp) ? c : temp;

    for(i=min;i<=n;i++){
        if( (i % a == 0)  || (i % b == 0) || (i % c == 0) ){
            count++;
        }
    }
    return count;

}

int main() {

    int t_i;

        long long n;
        scanf("%lld", &n);
        long long a;
        scanf("%lld", &a);
        long long b;
        scanf("%lld", &b);
        long long c;
        scanf("%lld", &c);

        long long out_ = divisibilty(a, c, b, n);
        printf("%lld", out_);

}

任何人都可以帮助我找到更好的解决方案

2 个答案:

答案 0 :(得分:4)

只给出n和a,有n / a个数可被a整除。

给定n,a和b,有A = n / a和B = n / b个数可被任意整除 - 而AB = n /(a * b)可被两者整除。解决方案是A + B-AB。

继续三个单独的数字,将有A + B + C-AB-BC-CA + ABC数字被任何一个整除,并省略重复。

答案 1 :(得分:4)

我提出了一个数学解决方案。

除以a的数字是[n/a]。 ([]是一个底层函数。)

关于bclcm(a, b)lcm(a, c)lcm(b, c)lcm(a, b, c)也是如此。 (lcm表示最小公倍数。)

所以答案应该是

([n/a]+[n/b]+[n/c])-([n/lcm(a,b)]+[n/lcm(a,c)]+[n/lcm(b,c)])+[n/lcm(a,b,c)]

enter image description here