<html> <head> <meta http-equiv="content-type" content="text/html";charset="utf-8" /> </head> <body> 1.十几乘十几:<br> 口诀:头乘头,尾加尾,尾乘尾。<br> 例:12×14=?<br> 解: 1×1=1<br> 2+4=6<br> 2×4=8<br> 12×14=168<br> 注:个位相乘,不够两位数要用0占位。<br> <?php //game_su_cal.php //1,1,2,3,5,8,13,21,.... X(n为第n个数) 已知n,求X的值? //公式:(n=1,x=1 // n=2,x=1 // n>2,x=x(n-1)+x(n-2)) // 采用递归算法 // //1,1,2,3,5,8,13,21,....X(n) function GetNumSum($n) { $r = 0; if ($n == 1 || $n==2) { $r = 1; } if ($n > 2) { $r = GetNumSum($n - 1) + GetNumSum($n - 2); } return $r; } /* TODO: Add code here */ //两位数乘两位数乘法 速算验证函数 function sucal($num1,$num2) { $r=0; if(strlen($num1)==1) $num1="0".$num1; if(strlen($num2)==1) $num2="0".$num2; //5.11乘任意数 if($num1==11||$num2==11) { if($num2==11) { //值交换,以保证第一个值为11 $tmp=$num1;$num1=$num2;$num2=$tmp; } //口诀:首尾不动下落,中间之和下拉 $len=strlen($num2); if(($len==1)||($len==2 && substr($num2,0,1)==0)) { //这个11x(1~9)就不用口诀了吧! $r=$num1*$num2; } else { $r=substr($num2,0,1); //首尾不动下落 //中间之和下拉 for($i=0;$i<$len-1;$i++) { $r=$r.''.substr($num2,$i,1)+substr($num2,$i+1,1); } $r=$r.''.substr($num2,$len-1,1); //首尾不动下落 } } //1.十几乘十几 elseif($num1>=10 && $num1<20 && $num2>=10 && $num2<20) { //口诀:头乘头,尾加尾,尾乘尾。 $h_mul=substr($num1,0,1)*substr($num2,0,1); //头乘头 $w_add=substr($num1,1,1)+substr($num2,1,1); //尾加尾 $w_mul=substr($num1,1,1)*substr($num2,1,1); //尾乘尾 $sw=0;$bw=0; //对个位数修正 对$w_mul修正 if($w_mul>=10) { $sw=substr($w_mul,0,1); //除10取整数 $w_mul=substr($w_mul,1,1); //除10取余数 } //对十位数修正 对$w_add修正 $w_add=$w_add+$sw; if($w_add>=10) { $bw=substr($w_add,0,1); //除10取整数 $w_add=substr($w_add,1,1); //除10取余数 } //对百位数修正 对h_mul修正 $h_mul=$h_mul+$bw; //计算的结果进行组合 $r=$h_mul.''.$w_add.''.$w_mul; } //6.十几乘任意数 elseif($num1>=10 && $num1<20||$num2>=10 && $num2<20) { if($num2>=10 && $num2<20) { //值交换,以保证第一个值为十几 $tmp=$num1;$num1=$num2;$num2=$tmp; } //6.十几乘任意数 12*21 10x20 //口诀:第二乘数首位不动向下落, //第一因数的个位乘以第二因数后面每一个数字,加下一位数,再向下落。 //echo "--------口决6---------<br>"; $h_1=substr($num1,1,1); //第一因数的个位 $len=strlen($num2)-1; //echo $len."长度<br>"; $jw=0; //进位数 for($i=$len;$i>=0;$i--) { $sum=0; if($i==$len) { $sum=$h_1*substr($num2,$i,1); //echo $sum."个位数值<br>"; } else { $sum=$h_1*substr($num2,$i,1)+substr($num2,$i+1,1)+$jw; } $jw=0; //上行已累加进位数,这里该清零 if($sum>=10) { //满10进位 $jw=substr($sum,0,1); $sum=substr($sum,1,1); } if($i==$len) { $r=$sum; } else { $r=$sum.''.$r; } } $r=substr($num2,0,1)+$jw.''.$r; //首尾不动下落 //echo "-----------------<br>"; } //4.几十一乘几十一 elseif(substr($num1,1,1)==1 && substr($num2,1,1)==1) { //口诀:头乘头,头加头,尾乘尾。 $h_mul=substr($num1,0,1)*substr($num2,0,1); //头乘头 $h_add=substr($num1,0,1)+substr($num2,0,1); //头加头 $w_mul=substr($num1,1,1)*substr($num2,1,1); //尾乘尾 $sw=0;$bw=0; //对个位数修正 if($w_mul>=10) { $sw=substr($w_mul,0,1); $w_mul=substr($w_mul,1,1); } //对十位数修正 $h_add=$h_add+$sw; if($h_add>=10) { $bw=substr($h_add,0,1); $h_add=substr($h_add,1,1); } //对百位数修正 $h_mul=$h_mul+$bw; //组合计算结果值 $r=$h_mul.''.$h_add.''.$w_mul; } //3.第一个乘数互补,另一个乘数数字相同 elseif((substr($num1,0,1)+substr($num1,1,1))==10 && substr($num2,0,1)==substr($num2,1,1)|| (substr($num2,0,1)+substr($num2,1,1))==10 && substr($num1,0,1)==substr($num1,1,1)) { if((substr($num2,0,1)+substr($num2,1,1))==10 && substr($num1,0,1)==substr($num1,1,1)) { //交换$num1和$num2的值,以保证第一个乘数互补 $tmp=$num1;$num1=$num2;$num2=$tmp; } //口诀:一个头加1后,头乘头,尾乘尾 $h_add_1=substr($num1,0,1)+1; //一个头加1后 $h_mul=$h_add_1*substr($num2,0,1); //头乘头 $w_mul=substr($num1,1,1)*substr($num2,1,1); //尾乘尾 //对个位数修正 if(strlen($w_mul)==1) $w_mul="0".$w_mul; //个位相乘,不足两位要补0 //计算的结果进行组合 $r=$h_mul.''.$w_mul; } //2.头相同,尾互补(尾相加等于10) elseif(substr($num1,0,1)==substr($num2,0,1) &&(substr($num1,1,1)+substr($num2,1,1))==10) { //口诀:一个头加1后,头乘头,尾乘尾。 $h_add_1=substr($num1,0,1)+1; //一个头加1后 $h_mul=$h_add_1*substr($num2,0,1); //头乘头 $w_mul=substr($num1,1,1)*substr($num2,1,1); //尾乘尾 //对个位数修正 if(strlen($w_mul)==1) $w_mul="0".$w_mul; //个位相乘,不足两位要补0 //计算的结果进行组合 $r=$h_mul.''.$w_mul; } else { //一般计算机乘法 //$r=$num1*$num2; } return $r; //$r即为计算结果值 } //下面来看看10到20以内的数计算情况 echo "输出格式:一个数x另一个数=计算机值=速算值<br>"; for($i=10;$i<20;$i++) { for($j=10;$j<20;$j++) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } //echo '12x14='.(12*14).'='.sucal(12,14);echo '<br>'; //echo '16x19='.(16*19).'='.sucal(16,19);echo '<br>'; ?> 2.头相同,尾互补(尾相加等于10):<br> 口诀:一个头加1后,头乘头,尾乘尾。<br> 例:23×27=?<br> 解:2+1=3<br> 2×3=6<br> 3×7=21<br> 23×27=621<br> 注:个位相乘,不够两位数要用0占位。<br> <?php for($i=10;$i<100;$i++) { for($j=10;$j<100;$j++) { if(substr($i,0,1)==substr($j,0,1) && (substr($i,1,1)+substr($j,1,1)==10)) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } } ?> 3.第一个乘数互补,另一个乘数数字相同:<br> 口诀:一个头加1后,头乘头,尾乘尾。<br> 例:37×44=?<br> 解:3+1=4<br> 4×4=16<br> 7×4=28<br> 37×44=1628<br> 注:个位相乘,不够两位数要用0占位。<br> <?php for($i=10;$i<100;$i++) { for($j=10;$j<100;$j++) { if((substr($i,0,1)+substr($i,1,1))==10 && substr($j,0,1)==substr($j,1,1)|| (substr($j,0,1)+substr($j,1,1))==10 && substr($i,0,1)==substr($i,1,1)) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } } ?> 4.几十一乘几十一:<br> 口诀:头乘头,头加头,尾乘尾。<br> 例:21×41=?<br> 解:2×4=8<br> 2+4=6<br> 1×1=1<br> 21×41=861<br> <?php for($i=10;$i<100;$i++) { for($j=10;$j<100;$j++) { if(substr($i,1,1)==1 && substr($j,1,1)==1) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } } ?> 5.11乘任意数:<br> 口诀:首尾不动下落,中间之和下拉。<br> 例:11×23125=?<br> 解:2+3=5<br> 3+1=4<br> 1+2=3<br> 2+5=7<br> 2和5分别在首尾<br> 11×23125=254375<br> 注:和满十要进一。<br> <?php $i=11; for($j=10;$j<=100;$j++) { if($i==11||$j==11) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } ?> 6.十几乘任意数:<br> 口诀:第二乘数首位不动向下落,第一因数的个位乘以第二因数后面每一个数字,<br> 加下一位数,再向下落。<br> 例:13×326=?<br> 解:13个位是3<br> 3×3+2=11<br> 3×2+6=12<br> 3×6=18<br> 13×326=4238<br> 注:和满十要进一。<br> <?php for($i=10;$i<20;$i++) { for($j=10;$j<=100;$j++) { $sval=$i*$j; $calval=sucal($i,$j); echo $i.'x'.$j.'='.$sval.'='.$calval; if($calval!=$sval) echo 'X'; echo '<br>'; } } ?> </body></html>