2014-03-04 284 views
0

我已經寫了一個腳本來爲我自動化一些計算。這很簡單。 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9等等。當答案(產品)超過一位數字時,我希望它添加答案的數字。 3 * 4 = 12 || 1 + 2 = 3。 我希望它自動添加答案,如果它不止一個數字,無論添加答案的次數多於一個數字。 ,當你達到13 * 3 = 39 ||時3 + 9 = 12 || 1 + 2 = 3 目前我的代碼不循環,我不知道如何使它在這裏循環。我怎樣才能更有效地循環這個過程

http://screencast.com/t/MdpQ9XEz

另外,不加入了超過2位的答案見34 * 3 = 102。在這裏任何幫助,讓它無限添加將是偉大的。 隨着每條生產線的答案變得越來越大,所以它應該在答案中增加儘可能多的數字。

這裏是我的代碼:

$i = 1; //Start with one 
function count_digit($number) { 
    return strlen((string) $number); 
}; 
while($i < 500){ 
    $product = $i * 3; //Multiply set 
    $number_of_digits = count_digit($product); //calls function to count digits of $sum 

     if($number_of_digits > 1){ //if $sum has more than one digit add the digits together 
     $addproduct = strval($product);//seperates the digits of $sum 
     $ii = 0; 

     while($ii <= $number_of_digits -1){ 
      $io = $ii + 1; 
      if($io < $number_of_digits){ 
       $one = intval($addproduct[$ii]); 
       $two = intval($addproduct[$io]); 
       $sum = $one + $two; 
       print($i . ' * 3 = ' .$product. ' || ' .$one. ' + ' .$two. ' = ' .$sum. '<br>'); 
      };$ii++; 
     }; 

    }else{ 
     Print ($i . ' * 3 = ' .$product.'<br>'); //Print Set 
    }; 
$i++; //add one 

}

回答

0

一開始,你可能會更換$i=1while ...,並$i++到一個語句:for ($i=0; $i<500; $i++) {.... - 見http://nz1.php.net/manual/en/control-structures.for.php有關循環的詳細信息。它實際上出現了相同的代碼,但將三個部分(初始化,測試,增量計數器)保持在一起;它清楚地表明它們是相關的,並且更快地理解。

接下來,我將取代數轉換爲字符串,看是否該字符串的長度大於一,等....有:

while ($product>10) { 
    $out=0; 
    while ($product) { 
     $out+=$product%10; 
     $product=(integer)($product/10); 
    } 
    $product=$out; 
} 

注意,在任何時候我會處理一個數字作爲一個字符串 - 我儘可能避免這種情況。

如果您不熟悉它,$something+=$somethingelse$something=$sometime+$somethingelse相同,只是簡寫。 $ out是運行總數,並且每次圍繞內部循環(同時產品$ product),$ out由最右邊的數字(1列)增加:$out+=$product%10 - 有關詳細信息,請參見http://nz2.php.net/operators.arithmetic,然後$ product除以10,轉換爲整數,所以12變爲1.2,然後1,刪除最右邊的數字。

每次內循環完成時($ product的所有數字都用完了,$ product是0),結果(in $ out)被複制到$ product,然後返回到外部循環(查看所有這些數字的總和現在是否小於10)。

同樣重要的是在每個循環中你打印什麼的確切位置。第一部分,乘法,立即在'500'循環中; '||'每次發生一次'$ product'減少到'$ out';數字的添加發生在最裏面的循環內,「+」或者除了第一個以外的每個數字之前,或者除了最後一個之外的每個數字之後。由於'除了最後一個'都更容易計算($ product> = 10,請觀察這些邊緣案例!),我選擇了那個。

另請注意,由於我從右到左添加了數字,而不是從左到右,所以添加是相反的。我不知道這是否會成爲問題。始終考慮是否顛倒訂單將爲您節省大量工作。顯然,如果他們需要按特定順序完成,那麼這可能是一個問題。

結果是:

for ($i=0; $i<500; $i++) { 
    $product = $i * 3; //Multiply set 
    print ($i . ' * 3 = ' .$product); 
    while ($product>10) { 
     print ' || '; 
     $out=0; 
     while ($product>0) { 
      print ($product%10); 
      if ($product>=10) { 
       print " + "; 
      } 
      $out+=$product%10; 
      $product=(integer)($product/10); 
     } 
     $product=$out; 
     print(' = ' .$product); 
     } 
     print "<br>"; 
    }; 
0

我決定添加此作爲一個單獨的答案,因爲它採用了不同的方法來回答你的問題:變化量最少來解決問題,而不是以易於閱讀的方式重寫代碼。

您的代碼有兩個問題,需要兩個單獨的修復程序。

問題1:您的代碼不能正確添加3位數(或更多)的數字。

如果仔細查看代碼,您會注意到您正在添加數字對($one$two);每次添加一對數字時,都會打印出來。這意味着對於號碼102,您要添加10,打印結果,然後添加02並將其打印出來。仔細看看你的結果,你會看到102出現兩次!

解決此問題的一種方法是使用$ 3和$ 4(對於500 * 3,4位數就足夠了)。這不是很好的編程,因爲如果你以後需要5位數字,你將需要5美元,等等。

編程的方法就是用零$sum開始,然後再通過每一個數字,並將其添加到總和,正是如此:

$ii = 0; 
    $sum = 0; 

    while($ii <= $number_of_digits - 1){ 
     $one = intval($addproduct[$ii]); 
     $sum = $sum + $one; 
     $ii++; 
    } 
    print($i . ' * 3 = ' .$product. ' || ' . $sum . '<br>'); 
    }; 

if消失,當然,因爲它涉及我們不再使用的$ io。

當然,現在你失去了打印個人數字的能力,因爲你正在添加它們。如果你想要那些人,並且由於我們事先不知道有多少人,你將不得不記錄下他們。一個字符串將適用於此。下面是我該怎麼做:

$ii = 0; 
    $sum = 0; 
    $maths = ""; 

    while($ii <= $number_of_digits-1){ 
     $one = intval($addproduct[$ii]); 

     if ($maths=="") { 
      $maths=$one; 
     } else { 
      $maths=$maths . " + " .$one; 
     } 

     $sum = $sum + $one; 
     $ii++; 
    } 
    print($i . ' * 3 = ' .$product. ' || ' . $maths . " = " . $sum . '<br>'); 
    }; 

注意$ math在他們的行;頂部有一個,將其設置爲空字符串。然後,一旦我們確定了要添加的數字,我們將其添加到$ maths。第一次是特殊情況,因爲我們不想在我們的第一個數字之前加「+」,所以我們會例外 - 如果$maths爲空,我們將其設置爲$one;在循環後面的時候,它不是空的,所以我們添加「+」。 $之一;

問題2:如果加法的結果超過1位數,則再次出發。再次,根據需要多次。

在這一點上,我會建議一點重構:我會打破print聲明爲幾個部分。首先乘法運算 - 在實際乘法運算後立即可以輕鬆移動到頂部。打印<br>可以在$i++之前結束。這也意味着你不再需要else條款 - 它已經完成。這隻留下' || ' . $maths . " = " . $sum。每次你進行添加時都會發生這種情況。

現在,將if($number_of_digits...替換爲while($number_of_digits...;這意味着它會根據需要經過多次,如果它是零或100。這意味着你將不得不在你的循環結束時更新$product$product = $sum; - 在打印語句後立即放置它。您還需要更新$number_of_digits;從頂部到循環結尾複製該行。

如果你一直在關注,您應該有:

$i = 1; //Start with one 
function count_digit($number) { 
    return strlen((string) $number); 
}; 
while($i < 500){ 
    $product = $i * 3; //Multiply set 
    print($i . ' * 3 = ' .$product); // Print basic multiplication 
    $number_of_digits = count_digit($product); //calls function to count digits of $sum 

     while ($number_of_digits > 1){ //if $sum has more than one digit add the digits together 
     $addproduct = strval($product);//seperates the digits of $sum 
    $ii = 0; 
    $sum = 0; 
    $maths = ""; 

    while($ii <= $number_of_digits-1){ 
     $one = intval($addproduct[$ii]); 

     if ($maths=="") { 
      $maths=$one; 
     } else { 
      $maths=$maths . " + " .$one; 
     } 

     $sum = $sum + $one; 
     $ii++; 
    } 
    print(" || " . $maths . " = " . $sum); // print one lot of adding 
    $product=$sum; 
    $number_of_digits = count_digit($product); //calls function to count digits of $sum 
    }; 
    Print ("<br>"); //go to next line 
$i++; //add one 
} 
相關問題