6174猜想

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。 http://blog.csdn.net/mayongzhan - 马永占,myz,mayongzhan

<!-- 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 "&nbsp;[编号]&nbsp;[原数字]&nbsp;[第N次转换的结果]&nbsp;...<br />";
foreach ($arrayResult as $value) {
foreach ($value as $value2) {
if ($value2 == '6174') {
echo "&nbsp;[<span style='color:red;'>" . $value2 . "</span>]&nbsp;";
}
else {
echo "&nbsp;[" . $value2 . "]&nbsp;";
}
}
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值