速算口决的php代码验证实例程序

<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>

你可能感兴趣的:(速算口决的php代码验证实例程序)