标题: 6174猜想
mayongzhan
PHPEye Developer
Rank: 8Rank: 8


UID 136
精华 2
积分 20
帖子 41
翻译 18
原创 1
阅读权限 1
注册 2007-6-30
状态 离线
发表于 2007-11-21 11:16  资料  短消息  加为好友 
6174猜想

http://blog.csdn.net/mayongzhan/archive/2007/11/09/1875461.aspx

<!-- 6174猜想
1955年,卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数,
只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174.例如:
k0=5298,k1=9852-2589=7263,k2=7632-2367=5265,k3=6552-2556=3996,k4=9963-3699=6264,k5=6642-2466=4176,k6=7641-1467=6174.
后来,这个问题就流传下来,人们称这个问题为"6174问题",上述变换称为卡普耶卡变换,简称 K 变换. -->

<!-- 写了下代码证明这个东西....发现不重复的数永远在7次以内会得6174,重复的数会有时出错,但是如果强制是4位的话,还是6174...哪里出错了.有兴趣的自己看一下吧........顺便可以测测5位的数字6位的数字....三位时是475,其他的好象不太清楚.有兴趣自己研究下 -->

<!-- 代码如下 -->
<?php
/**
* @name test.php
* @date Thu Nov 08 15:00:17 CST 2007
* @copyright 马永占(MyZ)
* @author 马永占(MyZ)
* @link http://blog.csdn.net/mayongzhan/
*/
/**
* 测试6174,需要:测试次数,变换次数,是否可以是重复的数,数的位数
* 不重复的4位需要7次或者更少就可以得到6174
* @param int $count
* @param int $changeCount
* @param boolean $s
* @param int $h
* @return array
*/
header("Content-Type: text/html; charset=utf-8");
function test6174($count, $changeCount, $s, $h)
{
       $arrayResult = array();
       for ($i = 1; $i <= $count; $i++) { //测试次数
              $tempPowH = pow(10,$h); //加工一下变成数,总觉得函数比变量费资源
              if ($s) {
                     $tempNum = rand($tempPowH/10, $tempPowH-1); //根据变量确定随即范围
              }
              else {
                     do {
                            $tempNum = rand($tempPowH/10, $tempPowH-1); //根据变量确定随即范围
                     }while (diffNum($tempNum,$h)); //当数是重复数的时候判断是否和$s相同,再取一次
              }
              $arrayResult[$i-1] = array($i,$tempNum);
              $tempNumT = $tempNum;
              for ($j = 1; $j <=$changeCount; $j++){ //变换次数
                     $tempNumT = splitNum($tempNumT, $h);
                     rsort($tempNumT); //从大到小排序
                     $tempNumA = 0;
                     foreach ($tempNumT as $value) {
                            $tempNumA = $tempNumA*10+$value;
                     }
                     sort($tempNumT); //从小到大排序
                     $tempNumB = 0;
                     foreach ($tempNumT as $value) {
                            $tempNumB = $tempNumB*10+$value;
                     }
                     $tempNumT = $tempNumA-$tempNumB;
                     array_push($arrayResult[$i-1],$tempNumT);
              }
       }
       return $arrayResult;
}
/**
* 测试是否是某两位相同,相同true,不同false
* @param int $tempNum
* @param int $h
* @return boolean
*/
function diffNum($tempNum, $h) //其实自己判断位数也行.不过上面都判断过了...就没必要了.
{
       $tempArray = splitNum($tempNum, $h);
       sort($tempArray); //排下序
       for ($i = 1; $i < $h; $i++) { //判断...
              if ($tempArray[$i-1] == $tempArray[$i]) {
                     $i = $h; //智慧.的体现.又能结束循环.又能得到标识...
              }
       }
       if ($i == $h+1) { //如果是正常结束那$i就是$h的值,因为$i++
              return true; //有相同的
       }
       else {
              return false; //没有相同的
       }
}
/**
* 切分数字为数组
* @param int $tempNum
* @param int $h
* @return array
*/
function splitNum($tempNum, $h)
{
       $tempArray = array();
       for ($i = 1; $i <= $h; $i++) { //利用循环取到每位上的数
              $tempPowH = pow(10,$h-$i); //加工一下变成数,还觉得函数比变量费资源
              $numA = ($tempNum-$tempNum%$tempPowH)/$tempPowH;
              $tempNum = $tempNum-$numA*$tempPowH; //抹掉已经得到的那位
              array_push($tempArray, $numA);
       }
       return $tempArray;
}

$count = 20;
$changeCount =10;
$s = 0;
$h = 4;
$arrayResult = test6174($count, $changeCount, $s, $h); //测试5次,变换10次,不重复的数,4位的数,看是否是6174
echo "共测试<span style='color:red;'>" . $count . "</span>次,";
echo "<span style='color:red;'>" . $h . "</span>位的数,";
echo "变换<span style='color:red;'>" . $changeCount . "</span>,";
echo "该数是否重复:<span style='color:red;'>" . $s . "</span><br />";
echo "测试结果如下:<br />";
echo " [编号] [原数字] [第N次转换的结果] ...<br />";
foreach ($arrayResult as $value) {
       foreach ($value as $value2) {
              if ($value2 == '6174') {
                     echo " [<span style='color:red;'>" . $value2 . "</span>] ";
              }
              else {
                     echo " [" . $value2 . "] ";
              }
       }
       echo "<br />";
}
?>







<!-- 一般地,只要在0,1,2,...,9中任取四个不全相等的数字组成一个整数k0(不一定是四位数),然后从k0开始不断地作K变换,得出数k1,k2,k3,...,则必有某个m(m=<7),使得km=6174.
更一般地,从0,1,2,...,9中任取n个不全相同的数字组成一个十进制数k0(不一定是n位数),然后,从k0开始不断地做K变换,得出k1,k2,...,那么结果会是怎样的呢?现在已经知道的是:
n=2,只能形成一个循环27,45,09,81,63).例如取两个数字7与3,连续不断地做K变换,得出:36,27,45,09,81,27,...出现循环.
n=3,只能形成一个循环495).
n=4,只能形成一个循环6174).
n=5,已经发现三个环:(53855,59994),(62964,71973,83952,74943),(63954,61974,82962,75933).
n=6,已经发现三个循环:(642654,...),(631764,...),(549945,...).
n=7,已经发现一个循环:(8719722,...).
n=8,已经发现四个循环:(63317664),(97508421),(83208762,...),(86308632,...)
n=9,已经发现三个循环:(864197532),(975296421,...),(965296431,...)
容易证明,对于任何自然数n>=2,连续做K变换必定要形成循环.这是因为由n个数字组成的数只有有限个的缘故.但是对于n>=5,循环的个数以及循环的长度(指每个循环中所包含数的个数)尚不清楚,这也是国内一些数学爱好者热衷于研究的一个课题.-->
v





顶部
 


PHPEye开源社区


当前时区 GMT+8, 现在时间是 2008-10-16 04:58

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.016524 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - PHPEye开源社区 - Archiver