JAVA实现的吸血鬼数字算法,高效率版本(同时求助算法高人解惑)

老紫竹 2009-01-23 10:23:02
关于吸血鬼数字的解释我就不写了,原文在我的博客里:
http://blog.csdn.net/java2000_net/archive/2009/01/23/3851203.aspx

希望能解决里面的关键代码
        // 下面的这个代码,我个人并不知道为什么,汗颜
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}


...全文
1802 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
y819427721 2012-06-17
  • 打赏
  • 举报
回复
解释地很清楚
Silence- 2012-03-01
  • 打赏
  • 举报
回复
谢谢,谢谢
Silence- 2012-03-01
  • 打赏
  • 举报
回复
看了,感谢
jiangxueping8 2011-11-22
  • 打赏
  • 举报
回复
谢谢,很有用
wqvbqjgwhvbw 2011-04-22
  • 打赏
  • 举报
回复
二十五楼的看懂了,,需要点分,,不知道怎么得到??我也是个爱好者
yanboliu_hz 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 hyj1023806827 的回复:]
for (int i = 10; i < 100; i++)
{
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
i_val = i * j;
if (i_val % 100 == 0 || (……
[/Quote]

from取max是为了不重复,至于to取min确实没什么用
hyj1023806827 2010-05-24
  • 打赏
  • 举报
回复
for (int i = 10; i < 100; i++)
{
from = Math.max(1000 / i, i + 1);
to = Math.min(10000 / i, 100);
for (int j = from; j < to; j++) {
i_val = i * j;
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
复制到这里就够了 ,求教j = from中from = Math.max(1000 / i, i + 1)为什么要这么写,另外to = Math.min(10000 / i, 100); 不是始终是100么 ,为什么要多次一举

lyx_0010 2009-02-03
  • 打赏
  • 举报
回复
学习了。顶
映维网 2009-01-24
  • 打赏
  • 举报
回复
9的倍数 学习了!
cxz7531 2009-01-24
  • 打赏
  • 举报
回复
假设val = 1000a + 100b + 10c + d, 拆分成val = x * y

而x是a、b、c、d中两个的线性组合,y是另两个的线性组合,系数分别是10和1
则val-x-y
=val-m1*a-m2*b-m3*c-m4*d //m1\m2\m3\m4 是10或者是1
=1000a + 100b + 10c + d-m1*a-m2*b-m3*c-m4*d
=(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d

1000-m1等900或者999,能被9整除
100-m2等90或者99,能被9整除
10-m3等0或者9,能被9整除
1-m4等-9或者0,能被9整除

所以(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d能被9整除
得到val-x-y能被9整除



showde123 2009-01-24
  • 打赏
  • 举报
回复
学习
sundianzhe 2009-01-24
  • 打赏
  • 举报
回复
还是8楼的解释更合理 ,第一个条件好理解,就是吸血鬼数的性质,
而第二个应该吸血鬼数的必要条件。支持8楼!!!
老紫竹 2009-01-23
  • 打赏
  • 举报
回复
6880 - 68 - 80 = 6732
6732 / 9 = 748

fulianglove 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tiancuiwusky 的回复:]
引用 4 楼 MT502 的回复:
假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x = 10a + b, y = 10c + d
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。



如果x = 10a + b, y = 10c + d ,那么val = x * y 不是应该= 100ac + 10ad + 10bc + bd吗??
[/Quote]
8楼解释的更清楚
tiancuiwusky 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 MT502 的回复:]
假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x = 10a + b, y = 10c + d
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。
[/Quote]


如果x = 10a + b, y = 10c + d ,那么val = x * y 不是应该= 100ac + 10ad + 10bc + bd吗??


tiancuiwusky 2009-01-23
  • 打赏
  • 举报
回复
一定能被9整除?

80*86=6880


这组数字呢???
lshy168 2009-01-23
  • 打赏
  • 举报
回复 1
[Quote=引用 4 楼 MT502 的回复:]
假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x = 10a + b, y = 10c + d
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。

[/Quote]
这个就是最好的了。
kao331431214 2009-01-23
  • 打赏
  • 举报
回复
学习
fulianglove 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 szws 的回复:]
abcd = 1000a+100b+10c-d
任意的2位组合,如ac,db, 表示为10a+c,10d+b
则abcd - ac-db = 990a+99b+9c-9d
这个数肯定是9的倍数,
对于其他的2位组合,也成立
所以,对于满足条件的吸血鬼数字,(i_val - i - j) % 9 != 0 肯定成立
不满足这个条件的,则不是吸血贵数字
[/Quote]
不错!维基百科也说了一些[傅利曼数]
bzwm 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 MT502 的回复:]
假设val = 1000a + 100b + 10c + d, 因为满足val = x * y, 则有x = 10a + b, y = 10c + d
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。

[/Quote]
学习了,明白了。
加载更多回复(15)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧