用php解决一个数学题【已有很多高手解决,期待更好的算法的出现】
来源:互联网 发布:wget 命令 windows 编辑:程序博客网 时间:2024/05/17 01:43
http://www.phpchina.com/html/00/54500_itemid_29653.html
一个六位数,当分别用2,3,4,5,6乘它后,得到的五个乘积都是一个六位数,而且这得到的五个数是由原来六个数字组成,只是顺序改变了!
求高手帮助解决下!
---------------
貌似大家都默认了一个现象
http://bbs.phpchina.com/viewthread.php?tid=54377&page=5#pid394850
之前提出的一个假设 貌似大家做算法的时候都不考虑这种情况的存在可能 如果哪位有论证过这种假设不成立或者楼主的题目本身就默认不考虑这种假设 请大侠们说明一下
如果没有论证或者题目没有明确说明不考虑这种假设 算法设计再好也是不合题意的无效算法
------------------------
写了两种算法:
第一种思路是判断相乘的数的各个位之和是否相等,不过效率不太好。
第二种算法换了一种思路,用了字符反方向验证,因为正向会有一部分高位的不必要的运算。代码很简洁,效率很不错,附上代码:
第一种算法,判断各个位数之和:
===========================================================
第二种算法,字符反方向查询:
第一个算法在我的PE2140@2.66GHz上需要440ms,第二种只需要180ms。
---------------------------------
我之前提过这个问题了http://www.phpchina.com/bbs/thread-54377-2-1.html
解决的方法有一个:
得出每一位,逐个位排除.
如得两个位数相同,则两个同时删除或更改.
比如:
'123451'和'123456'
逐位删除或更改的话,剩下的一位就不等了.
----------------------------------
for($i = 100000;$i < 166667;$i++) //数的范围
{
....
for($ii=2;$ii<7;$ii++) // 2-6的倍数
{
.....
for($j=0;$j<6;$j++) //数的个数
{
if(strpos($i,substr($i*$ii,$j,1)) === false) //判断组成的数字 各个数字是否和原来的数一致
{
$a=false;
break;
}
}
}
}
-----------------------------
前面有人说过了
既然这6个数字组合后能出现被3整除的数 那这6个数字之和也必然能被3整除 所以这个数字本身也必须能被3整除 所以找一个能被3整除的数字做起点 每次递增3
显而易见 100000*6=600000 也就是 这个数字乘以6以后必然是大于600000的 最高位是6~9 那么这个原数中至少存在一个6~9之间的数字 否则这个6倍的数是由原数的6位数字组成并且仍为6位数就不可能成立了 那个正则正是保证原数中至少有一位是6~9的
一个六位数,当分别用2,3,4,5,6乘它后,得到的五个乘积都是一个六位数,而且这得到的五个数是由原来六个数字组成,只是顺序改变了!
求高手帮助解决下!
---------------
貌似大家都默认了一个现象
http://bbs.phpchina.com/viewthread.php?tid=54377&page=5#pid394850
之前提出的一个假设 貌似大家做算法的时候都不考虑这种情况的存在可能 如果哪位有论证过这种假设不成立或者楼主的题目本身就默认不考虑这种假设 请大侠们说明一下
如果没有论证或者题目没有明确说明不考虑这种假设 算法设计再好也是不合题意的无效算法
------------------------
写了两种算法:
第一种思路是判断相乘的数的各个位之和是否相等,不过效率不太好。
第二种算法换了一种思路,用了字符反方向验证,因为正向会有一部分高位的不必要的运算。代码很简洁,效率很不错,附上代码:
第一种算法,判断各个位数之和:
===========================================================
第二种算法,字符反方向查询:
第一个算法在我的PE2140@2.66GHz上需要440ms,第二种只需要180ms。
---------------------------------
我之前提过这个问题了http://www.phpchina.com/bbs/thread-54377-2-1.html
解决的方法有一个:
得出每一位,逐个位排除.
如得两个位数相同,则两个同时删除或更改.
比如:
'123451'和'123456'
逐位删除或更改的话,剩下的一位就不等了.
----------------------------------
for($i = 100000;$i < 166667;$i++) //数的范围
{
....
for($ii=2;$ii<7;$ii++) // 2-6的倍数
{
.....
for($j=0;$j<6;$j++) //数的个数
{
if(strpos($i,substr($i*$ii,$j,1)) === false) //判断组成的数字 各个数字是否和原来的数一致
{
$a=false;
break;
}
}
}
}
-----------------------------
前面有人说过了
既然这6个数字组合后能出现被3整除的数 那这6个数字之和也必然能被3整除 所以这个数字本身也必须能被3整除 所以找一个能被3整除的数字做起点 每次递增3
显而易见 100000*6=600000 也就是 这个数字乘以6以后必然是大于600000的 最高位是6~9 那么这个原数中至少存在一个6~9之间的数字 否则这个6倍的数是由原数的6位数字组成并且仍为6位数就不可能成立了 那个正则正是保证原数中至少有一位是6~9的
- 用php解决一个数学题【已有很多高手解决,期待更好的算法的出现】
- 期待高手路过,很多问题需要解决哈!!!
- 【已解决】关于很多网站Web被CC的防范
- 有趣的数学题,回家解决
- 解决数学题的编程思路
- NO.6有问题的一个程序明天再看(已找到未解决,次日解决)
- 电信ADSL连接的上 电信校园宽带WAN端口连不上(期待高手解决)
- 解决eclipse载入已有maven工程时出现的fail to read artifact descriptor....问题
- 一个诡异的问题,【已解决】
- [已解决] Android MediaPlayer 的一个错误
- 已解决:好用的集成PHP环境 一键安装包PHPNow--Win7下安装phpnow的方法出现[ Apache_pn ] 错误的解决 !(亲自测试通过)
- 初学编程 自己用Qt写的一个象棋界面、没有智能 没有限制旗子的 走法,递归 也有问题、有兴趣的朋友麻烦指导下、很长。。。没有积分也下不了其他的高手用Qt写的象棋、很多的不足、期待大家的意见
- 一个高效的导出Excel方法,并且已解决导出会有样式文件夹的问题
- 很有趣的一个数学题,让我死了很多脑细胞
- 一个解决OnNcLButtonUp不能响应消息问题的更好办法
- 我把一低版本的android导入,出现这个问题。无法解决。。。有厉害的高手么
- 关于解决在使用opencv时出现*.exe 已触发了一个断点的问题
- 真是每天有新的惊喜啊 - VS2010中出现令人期待已久的功能...Call Hierarchy
- 用C写一个自动关机程序
- PHP实现翻页跳转功能
- C++的static关键字
- 服务器不允许执行exe,但php程序需要用到exe,有没有办法?
- 色度图
- 用php解决一个数学题【已有很多高手解决,期待更好的算法的出现】
- UNIX/Linux常用命令
- 一、 User Interface
- 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接 的解决方法
- 是非人生——一个菜鸟程序员的5年人生路
- photoshop制作一寸照片
- vss 6.0 使用手册
- 扩展xtree内容如checkbox,radio.doc
- Domain-Specific Language Tools DSL工具