Algorithm 检查一个数字N是否是3和5的倍数之和,因为N可能大到100000

Algorithm 检查一个数字N是否是3和5的倍数之和,因为N可能大到100000,algorithm,optimization,Algorithm,Optimization,如果一个数字可能大到100000,如何检查该数字是否是3和5的倍数之和。我需要一个优化的方法将一个数字分成两部分,这样两部分仅为3和5的倍数,并且3的倍数大于5的倍数,如果这种分割不可能,那么我需要拒绝该数字 例如: 3和5的最大除数是1。 因此,当N=3或N>=5时,它可以是3和5的倍数之和。每个(整数)数模3产生0、1或2 因此,让我们检查所有情况(n>3必须屈服于明显的原因): n%3==0。简单:我们只需要将0==0*5和n/3作为拆分 n%3==2。再次简单:一个数字是5,另一个是(n

如果一个数字可能大到100000,如何检查该数字是否是3和5的倍数之和。我需要一个优化的方法将一个数字分成两部分,这样两部分仅为3和5的倍数,并且3的倍数大于5的倍数,如果这种分割不可能,那么我需要拒绝该数字

例如:


3和5的最大除数是1。 因此,当N=3或N>=5时,它可以是3和5的倍数之和。

每个(整数)数模3产生0、1或2

因此,让我们检查所有情况(n>3必须屈服于明显的原因):

  • n%3==0
    。简单:我们只需要将
    0==0*5
    n/3
    作为拆分
  • n%3==2
    。再次简单:一个数字是
    5
    ,另一个是
    (n-5)/3
    。当从n中减去5时,我们将创建第二个数字
    (n-5)
    ,它属于第一种情况
  • n%3==1
    。与案例2相同,但这次我们减去
    10==2*5

    一个小问题是3的倍数必须大于5的倍数。要使其成立,n必须至少为22。(
    22==2*5+3*4


  • 因此,所有小于22且属性为
    n%3==1
    的数字都必须被拒绝:
    4、7、10、13、16和19
    。(只要倍数的系数必须是非负的)。

    如果你想找到一种方法将一个数字分成两部分,其中第一部分是
    3的倍数,第二部分是
    5的倍数,额外要求第一部分(3的倍数)大于第二部分(5的倍数),那就相当琐碎了:

    20及以上的每个数字都可以这样分割

    证明:对于给定的数字
    N
    ,三个数字中的一个,
    N
    N-5
    N-10
    将是3的倍数(考虑
    模3
    算术)。因此,这三个拆分中的一个满足以下要求:

    N      0
    N-5    5
    N-10  10
    
    由于
    N>=20
    ,第一部分比第二部分大(或相等)。

    --

    使Q=N/3,整数除法,向下舍入。把R作为余数

    如果R=0,则完成

    如果R==2,则减小Q

    否则R必须是1,从Q中减去2

    你的答案是Q*3和N-(Q*3)。检查所有结果是否为阳性,以及是否满足3s倍数>5s倍数限制

    (请注意,这与Sirko的答案基本相同,但我觉得值得单独思考,因此我没有尝试分析他的第一个答案。)

    只需使用以下代码:- 享受:)

    $num=0;//大量
    $arr=array();
    如果(isset($_POST['number'])$num=$_POST['number'];
    //假设您发布了要检查的号码。
    $j=0;
    
    对于($i=0;$i)你的最佳尝试是什么样子的?39=15+24。你为什么说它不能被分割?@interjay-24不仅仅是3和5的倍数。它甚至不是5的倍数。我认为在某个
    N
    之上的每个数字都可以被分割成那样。(而且
    N
    会很低,比如
    19
    哪一个有
    9+10
    分割)@IVlad 24是3的倍数。我不知道“only”应该指什么。在给出的示例中,35->30+5:5不是3的倍数。30是2、3和5的倍数。非常感谢您的澄清。我的想法就是找不到关系。我的方法是在循环中执行N-5,除非(N-5)%3==0。这有神奇的帮助。您的意思是“拒绝:
    4、7、10、13、16和19
    ”(非21)我想知道你为什么拒绝21。它可以写成
    21+0
    @ypercube打字错误。谢谢。1.请解释你的答案在做什么,而不是仅仅转储一块代码。2.这太慢了,甚至不正确。它基本上枚举3和5的所有倍数,然后随机(!!!)选择其中的两个,直到找到解决方案。如果没有解决方案,它将一直尝试。那么,你似乎证明了7可以写成3的倍数和5的倍数的和?你能告诉我们怎么写吗?
    N      0
    N-5    5
    N-10  10
    
    $num = 0; // Large Number
    $arr = array();
    if(isset($_POST['number']) $num = $_POST['number'];
    // Assuming you post the number to be checked.
    
    $j=0;
    
    for($i=0;$i<$num;$i++) 
    {
    
    if(($num-$i)%3==0 || ($num-$i)%5==0) { $arr[j] = $num - $i; $j++; }
    
     }
     //This creates an array of all possible numbers.
     $keepLooping = true;
     while($keepLooping)
     { 
      $rand = array_rand($arr,2);
      if(($rand[0] + $rand[1]) == $num) 
       {
        //Do whatever you like with them. :)
       }
    
        }