关于吸血鬼数字的解释我就不写了,原文在我的博客里:
http://blog.csdn.net/java2000_net/archive/2009/01/23/3851203.aspx希望能解决里面的关键代码
// 下面的这个代码,我个人并不知道为什么,汗颜
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
http://blog.csdn.net/java2000_net/archive/2009/01/23/3851203.aspx希望能解决里面的关键代码
// 下面的这个代码,我个人并不知道为什么,汗颜
if (i_val % 100 == 0 || (i_val - i - j) % 9 != 0) {
continue;
}
所以i_val % 100 == 0就直接continue了
至于(i_val - i - j) % 9 != 0的话会导致什么样的数字就不清楚了(数学不好-_-!),一时间还找不到数学系的同学问问(都回家了)
期待楼下解答
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。
则val - x - y = 990a + 99b + 9c = 9 * (110a + 11b + c), 所以val - x - y能被9整除。
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。
任意的2位组合,如ac,db, 表示为10a+c,10d+b
则abcd - ac-db = 990a+99b+9c-9d
这个数肯定是9的倍数,
对于其他的2位组合,也成立
所以,对于满足条件的吸血鬼数字,(i_val - i - j) % 9 != 0 肯定成立
不满足这个条件的,则不是吸血贵数字
二、任何4位数i_val都可以表示为1000a+100b+10c+d
如果其是吸血鬼数字,其两个因子是i和j,那么i+j只能有以下六种情况:
1.(i+j)=10a+b+10c+d
2.(i+j)=10a+10b+c+d
3.(i+j)=10a+b+c+10d
4.(i+j)=a+10b+c+10d
5.(i+j)=a+10b+10c+d
6.(i+j)=a+b+10c+10d
所以无论上述的哪种情况下i_val-(i+j)都一定能被9整除,故不满足这个条件的一定不是吸血鬼数字,所以通过条件(i_val - i - j) % 9 != 0再过滤一次。以上是个人的理解,不知道对错,仅供参考,班门弄斧了:)
public class bloodSucker {
6
7 public static void main(String[] args) {
8 for(int i = 10; i <= 99; i++){
9 for(int j = 10; j<= 99; j++){
10 int sun = i*j;
11 if(sun >=1000 && sun <= 9999){
12 String [] str = String.valueOf(sun).split("");
13 Arrays.sort(str); //按照字符的升序排列
14 String [] str1 =(String.valueOf(i)+String.valueOf(j)).split("");
15 Arrays.sort(str1); //对两个Arrays进行比较
16 if(Arrays.equals(str, str1)){
17 System.out.println(i+"*"+j+"="+i*j);
18 }
19 }
20 }
21 }
22
23 }
24
25}
则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)d1000-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整除
{
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么 ,为什么要多次一举
from取max是为了不重复,至于to取min确实没什么用