吸血鬼数字

题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,这对数字各包含乘积的一半位数的数字,数字选取后可任意排序。写出一个程序,找出4位数的所有吸血鬼数字。

两个比较优化的解题方法:其中关于可能吸血鬼数字的筛选条件将数字单个位放到数组中的方法有所区别。

NO.1

import java.util.Arrays; 
class Vampire
{
public static void main(String[] args)
{
int[] startDigit=new int[4];
int[] productDigit=new int[4];
int count=0;
int sum=0;
for(int num1=10;num1<=99;num1++)
for(int num2=num1;num2<=99;num2++)
{
if((num1*num2)%9!=(num1+num2)%9||(num1*num2)%100==0)
continue;
count++;
int product=num1*num2;
startDigit[0]=num1/10;
startDigit[1]=num1%10;
startDigit[2]=num2/10;
startDigit[3]=num2%10;
productDigit[0]=product/1000;
productDigit[1]=(product%1000)/100;
productDigit[2]=product%1000%100/10;
productDigit[3]=product%1000%100%10;
Arrays.sort(startDigit);
Arrays.sort(productDigit);
if(Arrays.equals(startDigit,productDigit))
{
sum++;
System.out.println(num1+"*"+num2+"="+product);
}
       }
System.out.println("4位数中吸血鬼数总共有:"+sum+"个");
System.out.println(count);
}
}

运行结果:


NO.2

import java.util.Arrays;
public class Vampire2 {
  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++) {     
      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);
  }
}

运行结果:


结论:通过发现吸血鬼数字的一些特征,可以减少循环内部执行的次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值