Algorithm 检查一个数字N是否是3和5的倍数之和,因为N可能大到100000
如果一个数字可能大到100000,如何检查该数字是否是3和5的倍数之和。我需要一个优化的方法将一个数字分成两部分,这样两部分仅为3和5的倍数,并且3的倍数大于5的倍数,如果这种分割不可能,那么我需要拒绝该数字 例如: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
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. :)
}
}