检查数字N是3和5的倍数之和,因为N可能大到100,000

时间:2013-09-08 11:58:58

标签: algorithm optimization

如果数字可以大到100,000 ,我如何检查数字是否为3和5的倍数之和。我需要一种优化方法将数字分成两部分,这两部分是3和5的倍数,而3的倍数部分大于部分是5的倍数,如果不可能那种分裂那么我需要拒绝那个数字。

例如:

1  => cant be split so rejected ,
35 => 30 + 5 ,
65 => 60 + 5 (Though 30 + 35 could be a split but since part which is multiple of 3 has to be                greater than the part which is multiple of 5),
11 => 6+5 

5 个答案:

答案 0 :(得分:3)

模数为3的每个(整数)数字产生0,1或2。

因此,让我们检查一下所有情况(n> 3必须因为显而易见的原因而产生):

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

    一个小问题是3的倍数必须大于5的倍数。要保持为真,n必须至少为22.(22 == 2 * 5 + 3 * 4)。

  4. 因此,必须拒绝所有小于22且属性n % 3 == 1的数字:4, 7, 10, 13, 16 and 19。 (只要倍数的因子必须是非负的)。

答案 1 :(得分:1)

如果您想找到一种方法将数字拆分为两个部分,其中第一部分是3的倍数,第二部分是5的倍数,另外还要求第一个(3的倍数)部分大于第二个(5的倍数)部分,那么它相当简单:

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

证明:对于给定的号码N,这三个号码中的一个,NN-5N-10将是3(考虑modulo 3算术。)因此,这三个分裂中的一个满足要求:

N      0
N-5    5
N-10  10

N >= 20开始,第一部分比第二部分更大(或相等)。

答案 2 :(得分:0)

脱离我的头顶 -

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

如果R = 0,你就完成了。

如果R == 2,则递减Q。

否则R必须为1,从Q减去2.

您的答案是Q * 3和N - (Q * 3)。检查所有结果是否为正,并且3s倍数>满足5s多重限制。

(请注意,这与Sirko的答案基本相同,但我认为值得单独考虑,所以我没有尝试分析他的第一个。)

答案 3 :(得分:-2)

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

答案 4 :(得分:-5)

只需使用此代码: - 享受:)

$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. :)
   }

    }

我没有测试过它,但仅仅是为了你的想法。而不是for循环来选择可能性,你可以选择其他适合你的方式。