吸血鬼数字

来源:互联网 发布:阿里云邮箱免费注册 编辑:程序博客网 时间:2024/05/15 16:11
import java.util.Arrays;


/**
 * 
 * 吸血鬼数字
 * 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。<br> 
 * 比如 1395 =15 * 93 
 * @author yangyi
 *
 */
public class Account {
public static void main(String[] args) {
//共有符合条件的总数
int count =0;
//执行比较次数
int num = 0;
   for (int i = 10; i <= 99; i++) {
    for (int j = i + 1; j <= 99; j++) {
      // 计算出所有两位数的积
      int sum = i * j;
        // 下面的这个代码,我个人并不知道为什么,汗颜  
        if (sum % 100 == 0 || (sum - i - j) % 9 != 0) {  
          continue;  
        }
     if (sum <= 9999 && sum >= 1000) {
    num++;
    String[] t1 = (sum + "").split("");
    // 对数组t1进行升序排列
    Arrays.sort(t1);
    // 这个地方,把i和j都当String型的字符串加起来组成一个四位数
    String[] t2 = ("" + i + j).split("");
    // 对t2进行升序排列
    Arrays.sort(t2);
    //下面判断是通过两个已经排好序的数组相比较,当完全相同时执行
    if (Arrays.equals(t1, t2)) {
    count ++;
    System.out.println("第" + count +"组 :"+ i + "*" + j + "=" + i * j);
    }
      }
       }
     }
   System.out.println("比较次数:" + num);
     }

 }



/** 
 * 吸血鬼数字,高效率版本.<br> 
 * 一个4位数字,可以拆分2个2位数数字的乘积,顺序不限。<br> 
 * 比如 1395 =15 * 93 
 *  假设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整除,所以可以直接过滤其他数字。 
 * 
 */ 
public class Account {  
  public static void main(String[] arg) {  
    String[] ar_str1, ar_str2;  
    int sum = 0;  
    int from;  
    int to;  
    int i_val;  
    int count = 0;  
    // 双重循环穷举  
    for (int i = 10; i < 100; i++) {  
      // j=i+1避免重复  
      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;  
        }  
        count++;  
        ar_str1 = String.valueOf(i_val).split("");  
        ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");  
        Arrays.sort(ar_str1);  
        Arrays.sort(ar_str2);  
        if (Arrays.equals(ar_str1, ar_str2)) {// 排序后比较,为真则找到一组  
          sum++;  
          System.out.println("第" + sum + "组: " + i + "*" + j + "=" + i_val);  
        }  
      }  
    }  
    System.out.println("共找到" + sum + "组吸血鬼数");  
    System.out.println("执行对比次数:" + count);  
  }  
}  

0 0