如何在php中找到1000或1000以下的所有倍数的总和,问题?

时间:2011-12-28 07:59:27

标签: php math

我解决这个问题的方法存在一个小问题。

有人会说:println((0 /: ((0 until 1000).filter(x => x % 3 == 0 || x % 5 == 0))) (_+_))是女性添加到233168

的解决方案

我的方式是:

$maxnumber = 1000; 
for ($i = 3; $i < $maxnumber; $i += 3) 
{ 
         $t += $i; 
         echo $i.',';
}  
echo '<br>';
for ($j = 5; $j < $maxnumber; $j += 5) 
{ 
    $d += $j; 
    echo $j.',';
}  

echo '<br>';
echo $t;
echo '<br>';
echo $d;
echo '<br>';
echo $t+$d;

这会给我:

3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417,420,423,426,429,432,435,438,441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,492,495,498,501,504,507,510,513,516,519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678,681,684,687,690,693,696,699,702,705,708,711,714,717,720,723,726,729,732,735,738,741,744,747,750,753,756,759,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831,834,837,840,843,846,849,852,855,858,861,864,867,870,873,876,879,882,885,888,891,894,897,900,903,906,909,912,915,918,921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978,981,984,987,990,993,996,999

5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,245,250,255,260,265,270,275,280,285,290,295,300,305,310,315,320,325,330,335,340,345,350,355,360,365,370,375,380,385,390,395,400,405,410,415,420,425,430,435,440,445,450,455,460,465,470,475,480,485,490,495,500,505,510,515,520,525,530,535,540,545,550,555,560,565,570,575,580,585,590,595,600,605,610,615,620,625,630,635,640,645,650,655,660,665,670,675,680,685,690,695,700,705,710,715,720,725,730,735,740,745,750,755,760,765,770,775,780,785,790,795,800,805,810,815,820,825,830,835,840,845,850,855,860,865,870,875,880,885,890,895,900,905,910,915,920,925,930,935,940,945,950,955,960,965,970,975,980,985,990,995

$t - 166833
$d - 99500

总计:     266333

为什么我错了?

9 个答案:

答案 0 :(得分:8)

有些数字是3和5的倍数。(您的算法将这些数字加到总数中两次。)

答案 1 :(得分:3)

因为你重复计算3和5的倍数,即15的倍数。

你可以通过减去15的所有倍数来天真地解释这个。

for ($j = 15; $j < $maxnumber; $j += 15) 
{ 
    $e += $j; 
    echo $j.',';
}  
$total = $total - $d;

答案 2 :(得分:3)

因为6 * 5 == 30和10 * 3 == 30,你将两个数字加起来。

$sum = 0;
$i = 0;
foreach(range(0, 999) as $i) {
    if($i % 3 == 0 || $i % 5 == 0) $sum += $i;
}

答案 3 :(得分:2)

在您的情况下,如果是15,您将添加两次数字。

试试这个:

$t = 0;
$d = 0;

for ($i = 0; $i <= $maxnumber; $i++){
    if ($i % 3 == 0)
        $t+= $i;
    else if ($i % 5 == 0)
        $d += $i;
}

echo $t.'<br>'.$d;

答案 4 :(得分:1)

我认为在您的代码中,如果数字是3和5的倍数,则会添加两次。以15为例。它在你的3的倍数列表和5的倍数列表中。这是你想要的行为吗?

答案 5 :(得分:1)

此解决方案的最佳方法之一(以实现最佳的时间复杂度),运行算术级数序列,并使用AP公式查找所有序列中的项数: T = a +(n-1)d ,然后通过以下方式求和: S = n / 2 [2 * a +(n-1)d]

  • 其中:a =第一项,n =否。项,d =共同服从,T = nth项

下面的代码解决方案已经实现,以适应上面的问题-因此,值3和5是硬编码的。但是,可以修改该函数,以便将值作为变量参数传入。

function solution($number){

  $val1 = 3;
  $val2 = 5;
  $common_term = $val1 * $val2;

  $sum_of_terms1 = calculateSumofMulitples($val1,$number);
  $sum_of_terms2 = calculateSumofMulitples($val2,$number);
  $sum_of_cterms = calculateSumofMulitples($common_term,$number);

  $final_result = $sum_of_terms1 + $sum_of_terms2 - $sum_of_cterms;

  return $final_result;
}

function calculateSumofMulitples($val, $number)
{
    //first, we begin by running an aithmetic prograssion for $val up to $number say N to get the no of terms [using T=a +(n-1)d]
    $no_of_terms =   (int) ($number / $val);
    if($number % $val == 0) $no_of_terms = (int) ( ($number-1)/$val ); //since we are computing for a no of terms below N and not up to/exactly/up to N. if N divides val with no remainder, use no of terms = (N-1)/val 

    //second, we compute the sum of terms [using Sn = n/2[2a + (n-1)d]
    $sum_of_terms = ($no_of_terms * 0.5) * ( (2*$val)  + ($no_of_terms - 1) * $val );

    // sum of multiples 
    return $sum_of_terms;
}

答案 6 :(得分:0)

您可以运行单个循环来检查该数字是3 OR 5的倍数:

for ($i = 0; $i < $maxnumber; $i++) 
{
 if($i%3 || $i%5){
         $t += $i; 
         echo $i.',';}
}  

答案 7 :(得分:0)

我认为原始代码不包括总数中3和5的倍数的数字:如果测试3个匹配的多个,则需要并继续。 如果您将15的倍数加到1000,则得到33165,这正是您的总数266333和原始总数233168之间的差异。

答案 8 :(得分:0)

这是我对问题的解决方案:

<?php
$sum = 0;
$arr = [];
for($i = 1; $i < 1000; $i++){
if((int)$i % 3 === 0 || (int)$i % 5 === 0)
   {
    $sum += $i;
    array_push($arr,$i);
    }   
}
echo $sum;
echo '<br>';
print_r($arr);//Displays the values meeting the criteria as an array of values