用java求吸血鬼数字

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一

半位数的数字,其中从最初的数字中选取的数字可以任意排序。以2个0结尾的数字是不允许

的,例如,下列数字都是吸血鬼数字:

1260 = 21*60

1827 =21*87

2187 =27*81

写该程序的思想是:

1.首先找到满足这个等式的3个数,然后再从其中选出是吸血鬼数字的数字。下面的vampire

函数就是先找出这样的等式,然后调用CompareString()函数来判断是否是吸血鬼数字。

public static void Vampire()
	{
		for(int i =999;i<9999;i++)
		{
			if((i%100) == 0) continue;
				for(int j=11;j<100;j++)
					for(int k =11;k<j;k++)
					{
						if(j*k == i)
						{
							String si ="" +i;
							String sj ="" +j;
							String sk ="" +k;
							if(CompareString(si,sj,sk))
							{
								System.out.println(si +" =" +sj +"*"+sk);
							}
						}
					}
		}
	}

2.调用CompareString()函数有3个String参数,分别表示是乘积,乘数,乘数。在进行判断时,将2个乘数变为一个String再和乘积进行比较。比较过程中使用了一个Sort()的排序函数。

	public static boolean CompareString(String target,String str1,String str2)
	{
		
		int count  = 0;
		String StrTemp = str1 + str2;
		char s1[] =target.toCharArray();
		char s2[] = StrTemp.toCharArray();
		Sort(s1);
		Sort(s2);
		for(int i =0;i<s1.length;i++)
		{
			if(s1[i] == s2[i])
			{
				count++;
			}
		}
		if(count == s1.length) return true;  // 如果每一位都对应相同,则返回true;否则为false
		else return false;
		
	}

3.Sort()函数的作用将char数组中的数字,按照从小到大的顺序进行排列。如一个char数组为{'1','2','6','0'}则经过Sort()函数变为{'0','1','2','6'}.所以最后比较是否为吸血鬼数字,就是比较2个字符串经过排序后是否一样。其实2个乘数组合的字符串与乘积的字符串只是字母顺序不一样。经过排序后,就可以很好的比较了。

public static void Sort(char[] numArray)
	{
		int length = 0;
		length = numArray.length;	
		for(int i =1; i<length;i++)
		{
			int j = i -1;
			char Temp  = numArray[i];
			while(j>=0&&Temp<numArray[j])
				{
					numArray[j+1] = numArray[j];
					j--;
				}
				numArray[j+1] = Temp;
				
			}
		}

点击下载程序源代码

另附一网友JAVA实现吸血鬼数字的高效算法:http://blog.csdn.net/java2000_net/article/details/3851203

到此,就可以进行判断是否为吸血鬼数字了。

通过求吸血鬼数字,有一个很重要的思想对于如求类似的问题。如:

String s1 = "abcdsddgff";

String s2 = "ddfgfascdb";

要判断这2个字符串是否含有相同的字母,并且对于同一字母个数是否相同,就可以应用本思想。可以先将字符串排序后,再来进行比较。排序后s1变为abcdddffgs,s2变为abcdddffgs,则可以很容易比较了。至于排序算法,可以有很多选择。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值