如果数字可以大到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
答案 0 :(得分:3)
模数为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 and 19
。 (只要倍数的因子必须是非负的)。
答案 1 :(得分:1)
如果您想找到一种方法将数字拆分为两个部分,其中第一部分是3
的倍数,第二部分是5
的倍数,另外还要求第一个(3的倍数)部分大于第二个(5的倍数)部分,那么它相当简单:
20岁及以上的每个数字都可以这样分割。
证明:对于给定的号码N
,这三个号码中的一个,N
,N-5
,N-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循环来选择可能性,你可以选择其他适合你的方式。