//普通算法 穷举所以可能 总的比较次数:3154import java.util.Arrays; /** * 吸血鬼数字 * 一个4位数字,可以拆分2个2位数数字的乘积 * 比如 1395 =15 * 93 * * @author Flyingtiger */ public class ObjectTestDemo02{public static void main(String args[]){int count1=0;//统计共有几个吸血鬼数字int count2=0;//统计比较计算次数//双重循环 穷举所有数字for(int i=10;i<=99;i++){for(int j=i+1;j<=99;j++){ //j=i+1 避免重复 相乘没有先后int sum=i*j;if(sum>1000&&sum%100!=0){ //不能以00结尾String sumStr[]=String.valueOf(sum).split("");//拆分成单个字符String ijString[]=String.valueOf((i+""+j)).split("");Arrays.sort(sumStr);Arrays.sort(ijString);// 按升序排序 以便比较count2++;if(Arrays.equals(sumStr, ijString)){//是否完全相同count1++;System.out.println("第"+count1+"组吸血鬼数字是:"+sum+"="+j+"*"+i);}}}}System.out.println("总的比较次数:"+count2);}}/*Output:(100% matches)第1组吸血鬼数字是:1395=93*15第2组吸血鬼数字是:1260=60*21第3组吸血鬼数字是:1827=87*21第4组吸血鬼数字是:2187=81*27第5组吸血鬼数字是:1530=51*30第6组吸血鬼数字是:1435=41*35第7组吸血鬼数字是:6880=86*80总的比较次数:3154* *///优化算法 穷举所以可能 总的比较次数:229import java.util.Arrays;/** * 吸血鬼数字 一个4位数字,可以拆分2个2位数数字的乘积 比如 1395 =15 * 93 * * @author Flyingtiger */public class ObjectTestDemo01 {public static void main(String args[]) {int count1 = 0;// 统计共有几个吸血鬼数字int count2 = 0;// 统计比较计算次数int sum = 0;for (int i = 10; i <= 99; i++) {// 双重循环 穷举所有数字for (int j = i + 1; j <= 99; j++) { // j=i+1 避免重复 相乘没有先后sum = i * j;if (sum > 1000) {//循环条件限制 sum<10000 所以不用在判断if ((sum - i - j) % 9 != 0 || sum % 100 == 0) {continue;}String sumStr[] = String.valueOf(sum).split("");// 拆分成单个字符String ijString[] = String.valueOf((i + "" + j)).split("");Arrays.sort(sumStr);Arrays.sort(ijString);// 按升序排序 以便比较count2++;//比较次数++if (Arrays.equals(sumStr, ijString)) {// 是否完全相同count1++;System.out.println("第" + count1 + "组吸血鬼数字是:" + sum+ "=" + j + "*" + i);}}}}System.out.println("总的比较次数:" + count2);}}/*Output:(100% matches) 第1组吸血鬼数字是:1395=93*15第2组吸血鬼数字是:1260=60*21第3组吸血鬼数字是:1827=87*21第4组吸血鬼数字是:2187=81*27第5组吸血鬼数字是:1530=51*30第6组吸血鬼数字是:1435=41*35第7组吸血鬼数字是:6880=86*80总的比较次数:229 * */
//通过函数调用 遍历1001到9999的所有数字 /** * 吸血鬼数字 一个4位数字,可以拆分2个2位数数字的乘积 比如 1395 =15 * 93 * * @author Flyingtiger */public class ObjectTestDemo03 {static int count = 0;public static void main(String args[]) {for (int i = 1001; i < 10000; i++) {if (result(cov(a(i), b(i)), cov(c(i), d(i)), i)) {// continue 目的去重 如6880=86*80 等abcd=ba*cd=ca*bdcontinue;}if (result(cov(a(i), b(i)), cov(d(i), c(i)), i)) {continue;}if (result(cov(a(i), c(i)), cov(b(i), d(i)), i)) {continue;}if (result(cov(a(i), c(i)), cov(d(i), b(i)), i)) {continue;}if (result(cov(a(i), d(i)), cov(c(i), b(i)), i)) {continue;}if (result(cov(a(i), d(i)), cov(b(i), c(i)), i)) {continue;}if (result(cov(b(i), a(i)), cov(c(i), d(i)), i)) {continue;}if (result(cov(b(i), a(i)), cov(d(i), c(i)), i)) {continue;}if (result(cov(c(i), a(i)), cov(b(i), d(i)), i)) {continue;}if (result(cov(c(i), a(i)), cov(d(i), b(i)), i)) {continue;}if (result(cov(d(i), a(i)), cov(c(i), b(i)), i)) {continue;}if (result(cov(d(i), a(i)), cov(b(i), c(i)), i)) {continue;}}}public static int a(int num) {// 求千位return num / 1000;}public static int b(int num) {// 求百位return num % 1000 / 100;}public static int c(int num) {// 求十位return num % 100 / 10;}public static int d(int num) {// 求个位return num % 10;}public static int cov(int i, int j) {return i * 10 + j;}public static boolean result(int i, int j, int sum) {boolean flag = false;if (sum == i * j && sum % 100 != 0) {count++;System.out.println("第" + count + "组是:" + sum + "=" + i + "*" + j);flag = true;}return flag;}}/* * Output:(100% matches) * 第1组是:1260=21*60 * 第2组是:1395=15*93 * 第3组是:1435=41*35 * 第4组是:1530=51*30 * 第5组是:1827=21*87 * 第6组是:2187=27*81 * 第7组是:6880=86*80 */
0 0