观察算式

观察以下的算式:

△△△ * △△ = △△△△

某3位数乘以2位数,结果为4位数

要求:在9个△所代表的数字中。1~9的数字恰好每一个出现1次。

暴力破解代码:

package lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
long pre = System.currentTimeMillis();
int a1 ;
int a2 ;
int a3 ;
int a4 ;
int a5 ;
int a6 ;
int a7 ;
int a8;
int a9 ;
for (int i = 102; i <= 999; i++) {
a1 =i / 100;
a2 =i / 10 % 10;
a3 =i % 10; // if (a1 * a2* a3 == 0)
// continue ;// 假设包括0就退出
// if (a1== a2|| a2== a3
// || a1 == a3)
// continue ;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 99; j++) {
set.add(a1);
set.add(a2);
set.add(a3);
a4 =j / 10;
a5 =j % 10;
// if (a4*a5 == 0){
// set.clear();
// continue L2;// 假设包括0就进行下一轮循环
// }
// if (a4 == a5)
// {
// set.clear();
// continue L2;// 假设他们中有一对是相等就进行下一轮循环
// } int k = i * j;
if (k >= 1023 && k <= 9999) {// 假设他们的结果是4位不反复数字
a6=k / 1000;
a7=k / 100 % 10;
a8=k / 10 % 10;
a9=k % 10;
set.add(a4);
set.add(a5);
set.add(a6);
set.add(a7);
set.add(a8);
set.add(a9);
if (set.contains(0))
set.clear();
if (set.size() == 9) {// SET集合里一共同拥有9个元素说明找到了9个不反复的数字
System.out.println(i + "*" + j + "=" + k);
} }
set.clear();// 清除
}
}
System.out.println(System.currentTimeMillis() - pre); }
}

执行时间是46毫秒。

做了减枝推断后代码

package lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) {
Set<Integer> set = new HashSet<Integer>();
long pre = System.currentTimeMillis();
int a1 ;
int a2 ;
int a3 ;
int a4 ;
int a5 ;
int a6 ;
int a7 ;
int a8;
int a9 ;
for (int i = 102; i <= 999; i++) {
a1 =i / 100;
a2 =i / 10 % 10;
a3 =i % 10; if (a1 * a2* a3 == 0)
continue ;// 假设包括0就退出
if (a1== a2|| a2== a3
|| a1 == a3)
continue ;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 99; j++) {
set.add(a1);
set.add(a2);
set.add(a3);
a4 =j / 10;
a5 =j % 10;
if (a4*a5 == 0){
set.clear();
continue L2;// 假设包括0就进行下一轮循环
}
if (a4 == a5)
{
set.clear();
continue L2;// 假设他们中有一对是相等就进行下一轮循环
} int k = i * j;
if (k >= 1023 && k <= 9999) {// 假设他们的结果是4位不反复数字
a6=k / 1000;
a7=k / 100 % 10;
a8=k / 10 % 10;
a9=k % 10;
set.add(a4);
set.add(a5);
set.add(a6);
set.add(a7);
set.add(a8);
set.add(a9);
if (set.contains(0))
set.clear();
if (set.size() == 9) {// SET集合里一共同拥有9个元素说明找到了9个不反复的数字
System.out.println(i + "*" + j + "=" + k);
} }
set.clear();// 清除
}
}
System.out.println(System.currentTimeMillis() - pre); }
}

执行时间是32毫秒

最优的标准答案是:

package lianxijihe;
public class lianxi012
{
public static void main(String[] args)
{
long pre = System.currentTimeMillis();
for(int x=10; x<100; x++){
int a = x/10;
int b = x%10;
if(a==0 || b==0 || a==b) continue;
L1: for(int y=100; y<1000; y++){
int c = y / 100;
int d = y % 100 / 10;
int e = y % 10;
if(c*d*e==0) continue;
if(c==a || c==b) continue;
if(d==a || d==b || d==c) continue;
if(e==a || e==b || e==c || e==d) continue; int z = x * y;
if(z<1000 || z>=10000) continue; // 结果不是4位数 // 分解为位
int[] r = new int[4];
for(int i=0; i<r.length; i++){
r[i] = z % 10;
z /= 10; // 与乘数或被乘数有反复
if(r[i]==0) continue L1;
if(r[i]==a || r[i]==b || r[i]==c || r[i]==d || r[i]==e) continue L1;
} // 本身反复
if(r[0]==r[1] || r[0]==r[2] || r[0]==r[3]) continue;
if(r[1]==r[2] || r[1]==r[3]) continue;
if(r[2]==r[3]) continue; System.out.println(x + " * " + y + " = " + x*y);
}
}
System.out.println(System.currentTimeMillis() - pre);
}
}

执行仅仅有6毫秒  !

! 简直牛B。。

最新改进仅仅要3毫秒比标准答案还要牛B

package lianxijihe;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class lianxi028 { public static void main(String[] args) { int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
int a7;
int a8;
int a9;
long pre = System.nanoTime();
for (int i = 102; i <= 987; i++) {
a1 = i / 100;
a2 = i / 10 % 10;
a3 = i % 10; if (a1 * a2 * a3 == 0)
continue;// 假设包括0就退出
if (a1 == a2 || a2 == a3 || a1 == a3)
continue;// 假设他们中有一对是相等就退出
L2: for (int j = 10; j <= 98; j++) {
int k = i * j; if (k >= 1023 && k <= 9876) { a4 = j / 10;
a5 = j % 10;
if (a4 * a5 == 0) {
continue L2;// 假设包括0就进行下一轮循环
}
if (a4 == a5 || a4 == a1 || a4 == a2 || a4 == a3
|| a5 == a1 || a5 == a2 || a5 == a3) {
continue L2;// 假设他们中有一对是相等就进行下一轮循环
} a6 = k / 1000;
a7 = k / 100 % 10;
a8 = k / 10 % 10;
a9 = k % 10;
if(a9%2!=0)continue L2;
if (a6 * a7 * a8 * a9 == 0) {
continue L2;
}
if (a6 == a1 || a6 == a2 || a6 == a3 || a6 == a4
|| a6 == a5 || a7 == a1 || a7 == a2 || a7 == a3
|| a7 == a4 || a7 == a5 || a7 == a6) {
continue L2;
}
if (a8 == a1 || a8 == a2 || a8 == a3 || a8 == a4
|| a8 == a5 || a8 == a6 || a8 == a7) {
continue L2;
}
if (a9 == a1 || a9 == a2 || a9 == a3 || a9 == a4
|| a9 == a5 || a9 == a6 || a9 == a7 || a9 == a8) {
continue L2;
}
System.out.println(i + "*" + j + "=" + k); } }
}
System.out.println(System.nanoTime() - pre); }
}

枚举与剪枝_观察算式(比标准答案还要牛B)的更多相关文章

  1. 详解HTTP中GET与POST的区别,不是你看过的标准答案!

    防吐槽声明:本文适合程序员新人,自认阅文无数.技术超叼的大神不用看. GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含 ...

  2. GET和POST本质上有什么区别,这才是标准答案

    不知道各位读者在面试的时候,有没有被问过这个问题:"请说一下GET和POST两者的本质区别".基本上做过WEB开发的,对这个问题,都可以回答出一堆的区别. 比如: 最直接的区别,G ...

  3. C语言试题(标准答案)

    C语言试题(标准答案) 一.单选题(每小题2分,共20小题40分) 1.1-1.5    B D A C B                1.6-1.10    C A D B C 1.11-1.1 ...

  4. C语言编程规范试题(标准答案)

    C语言编程规范试题(标准答案) 一.单选题(每小题3分,共20小题60分) 1.1-1.5    B D A C B                1.6-1.10    C A D B C 1.11 ...

  5. JAVA可能问的几个面试题问题及问题的标准答案

    问题一:你希望工作环境是怎样的? 标准答案:我对环境没有苛求,我会努力适应环境的. 注:此问题是在测试你的求职心态,是以自己为中心还是以工作为中心. 问题二:你觉得自己有哪些缺点? 标准答案:说一些对 ...

  6. HDU 4431 Mahjong (DFS,暴力枚举,剪枝)

    题意:给定 13 张麻将牌,问你是不是“听”牌,如果是输出“听”哪张. 析:这个题,很明显的暴力,就是在原来的基础上再放上一张牌,看看是不是能胡,想法很简单,也比较好实现,结果就是TLE,一直TLE, ...

  7. c#中[Flags] 枚举类型定义问题_百度知道

    [Flags]的微软解释是“指示可以将枚举作为位域(即一组标志)处理.”其实就是在编写枚举类型时,上面附上Flags特性后,用该枚举变量是既可以象整数一样进行按位的“|”或者按位的“&”操作了 ...

  8. POJ-1190-生日蛋糕-DFS(深搜)-枚举-多重剪枝

    题目链接: 这个题目非常好,有难度:能够好好的多做做: #include<iostream> #include<string> #include<cstdio> # ...

  9. c++_凑算式(最新方法)

    凑算式 B DEFA + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比如:6+8/3 ...

随机推荐

  1. 001OC的结构解析

    Xcode通过.m扩展名来表示文件使用的是OC代码,C编译器处理.c文件,c++编译器处理cpp文件.所有编译工作默认由LLVM处理,这个编译器能够理解C语言的全部3个变体. #import<F ...

  2. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  3. 【Daily】 2014-4-23

    KEEP GOING Think more product when face difference Check value null when insert/remove/update/add ch ...

  4. ios 后台模式

    1.在后台可以继续播放音频 To play sound in the background, make sure to add the following to the Info.plist file ...

  5. Minimum Transport Cost(floyd+二维数组记录路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  6. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  7. 设置dialog显示,自定义时间到后dialog消失

    方法一: public class MyDialog extends Dialog { private int FLAG_DISMISS = 1; private boolean flag = tru ...

  8. list去重 转载

    http://blog.csdn.net/huaishuming/article/details/47778319 1. 单个List 去重: 如果用的是Set集合就不用怕重复的问题了,如果用的Lis ...

  9. MAVEN入门(一)

    一.Maven的基本概念 Maven是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1.项目构建 项目构建过程包括[清理项目]→[编译项目]→[测试项目]→ ...

  10. stat 函数讲解

    表头文件:    #include <sys/stat.h>                     #include <unistd.h>定义函数:    int stat( ...