2014-03-04 449 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 
} 
相关问题