【问题标题】:Fastest way to solve the divisibility of numbers [closed]解决数字可分性的最快方法[关闭]
【发布时间】:2017-07-21 18:56:20
【问题描述】:

我有一个程序,其中输入 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_);

}

谁能帮我找到更好的解决方案

【问题讨论】:

  • @Nishtha 我认为你的问题属于codereview.stackexchange.com
  • 你一定要使用long longs吗?
  • 您正在尝试暴力破解解决方案。许多此类问题需要您想出一种更有效的方法来解决问题。尝试优化代码是您应该尝试的最后一件事。
  • 10^9 适合带符号的 32 位整数
  • 我投票结束这个问题,因为它属于codereview.stackexchange.com

标签: c++ c algorithm


【解决方案1】:

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

数字的个数除以 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)]

【讨论】:

  • 请更好地格式化您的答案,以便更容易理解!现在它看起来像是一大堆随机性。
  • 整数除法隐含地板函数。
  • 可以测试实现您的解决方案吗?
  • @dbush,感谢您的修改,我会在 stackoverflow 上尽我所能。
  • (n,a,b,c)=(31,6,10,15), (31/6+31/10+31/15)-(31/30+31) 的情况/30+31/30)+31/30=8。它们是 6,10,12,15,18,20,24 和 30。
【解决方案2】:

只给定 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 数字可被其中任何一个整除并省略重复。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多