`
easyhaohao
  • 浏览: 13704 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

分治思想找24

阅读更多
原文:
[url]
http://hi.baidu.com/cesul/blog/item/998796880ba02899a5c2720b.html
[/url]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Find24 {
private static double threshold = 1E-6;
private static Double [] number = new Double[4];
private static String [] result = new String[4];
static Set<String> set = new HashSet<String>();

public static void main(String[] args) throws Exception{
   //获取输入
   System.out.println("请输入数字:(输入一个空一行)");
   BufferedReader bf;
   for (int i = 0; i < 4; i++) {
    bf = new BufferedReader(new InputStreamReader(System.in));
    result[i] = bf.readLine();
    number[i] = Double.valueOf(result[i]);
   }
   System.out.println("你输入的数字是:" + result[0]+ ", " + result[1]+ ", " + result[2]+ ", " + result[3]);
  
   Recurse_find(4);
  
   //用一个去除重复的HashSet统计结果并输出
   Iterator<String> it=set.iterator();
   while(it.hasNext()){
    System.out.println(it.next());
   }
   System.out.println("共有" + set.size() + "条参考结果。"); 
  
}

private static void Recurse_find(int n) {
   if (n == 1) {
    if( Math.abs(number[0] - 24) < threshold ){
     set.add(result[0].substring(1, result[0].length()-1) + " = 24"); //符合加入HashSet
    }else{
    }
   }
  
   for (int i = 0; i < n; i++) 
   {
    for (int j = i+1; j < n; j++) 
    {
    	
     double a, b; 
     String expa, expb;
     a = number[i];
     b = number[j];
     number[j] = number[n-1];
    
     expa = result[i];
     expb = result[j];
     result[j] = result[n-1];
    
     result[i] = "(" + expa + "+" + expb + ")";
     number[i] = a+b;
     Recurse_find(n-1);
    
     result[i] = "(" + expa + "-" + expb + ")";
     number[i] = a-b;
     Recurse_find(n-1);

     result[i] = "(" + expb + "-" + expa + ")";
     number[i] = b-a;
     Recurse_find(n-1);
  
     result[i] = "(" + expa + "*" + expb + ")";
     number[i] = a*b;
     Recurse_find(n-1);
    
     if(b != 0){
      result[i] = "(" + expa + "/" + expb + ")";
      number[i] = a/b;
      Recurse_find(n-1); 
     }
    
     if (a != 0) {
      result[i] = "(" + expb + "/" + expa + ")";
      number[i] = b/a;
      Recurse_find(n-1); 
     }
    
     number[i] = a;
     number[j] = b;
     result[i] = expa;
     result[j] = expb;
    }
   }
}
}



分享到:
评论

相关推荐

    算法思想——递归与分治

    算法思想——递归与分治 递归和分治是两种常用的算法思想,它们可以单独使用,也可以结合使用以解决复杂的问题。下面我们将详细探讨这两种算法思想。 递归是一种算法思想,它的基本思想是将一个问题分解成一个或多...

    分治思想写归并算法

    1. 分治思想: 分治法是计算机科学中一种重要的解决问题的方法。它将复杂的问题分解为规模较小的相同或相似的子问题,直到子问题可以简单的直接求解,原问题的解即子问题的解的合并。在归并排序中,这一思想体现在...

    使用分治法的插入排序

    **插入排序**是一种基础且广泛...总的来说,插入排序是一种简单而直观的排序算法,通过分治思想的类比,我们可以更好地理解和实现它。在学习和实践中,我们应根据具体场景选择合适的排序算法,以达到最佳的性能效果。

    基于分治思想的恒速升温PLC控制系统设计.pdf

    本文是一篇关于PLC温控系统的专业论文,它探讨了如何设计一个基于分治思想的恒速升温系统,强调了其在矿用钢丝绳双向拉伸设备中的应用。文章重点介绍了该系统的设计思路、工作原理以及实现的精度控制,并通过最小...

    分治算法思想简介PPT

    ACM中的分治算法 在此PPT中又有介绍 不过只是一个大致的思想 用于了解一下还是可以的

    用分治法求最大与最小值的问题

    在计算机科学中,分治法是一种重要的算法设计策略,它将一个大问题分解为若干个相同或相似的小问题,然后分别解决这些小问题,最后再将小问题的解合并成原问题的解。这个方法在处理复杂计算问题时非常有效,尤其是在...

    分治思想的棋盘算法java实现

    分治思想是计算机科学中的一种重要算法设计策略,它的核心理念是将一个复杂的问题分解成若干个规模较小、相互独立且与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。...

    递归思想和案列和分治法思想的案例

    递归思想和案列(阶乘函数,Fibonacci数列,Ackerman函数,整数划分问题,Hanoi塔问题)分治法思想的介绍(大整数的乘法,Strassen矩阵乘法,棋盘覆盖问题,二分搜索,快速排序,合并排序,线性时间选择)。算法课使用的ppt,可结合...

    分治法求众数.doc

    **分治法求众数** 分治法是一种重要的算法设计策略,它将复杂的问题分解成较小的子问题,然后递归地解决这些子问题,最后将子问题的解合并成原问题的解。在这个实验中,我们应用分治法来寻找数组中的众数,即出现...

    分治法--找最大值与最小值的代码

    分治法是计算机科学中一种重要的算法设计策略,它的核心思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在本案例中,我们将讨论...

    找第K小问题C语言-分治法

    首先,我们要理解分治法(Divide and Conquer)的基本思想。分治法是将一个大问题分解为若干个小问题,分别解决后再合并结果,以此达到高效求解的目的。对于找第K小问题,我们可以将其分为以下几个步骤: 1. **划分...

    算法与分析实验一:分治与递归

    分治法作为其中一种基本算法思想,具有广泛的适用场景。在“算法与分析实验一:分治与递归”中,我们重点探讨了如何将分治法应用于具有特定规则的网球循环赛日程表设计问题,旨在加深对分治策略的理解,并将理论知识...

    java另类分治法凸包问题

    在这个问题中,我们采用了一种基于分治法的创新方法来解决凸包问题,其核心思想是通过不断旋转点集,找到当前点集合的左边点,最终形成一个顺时针排列的凸包。 首先,我们理解分治法的基本概念。分治法是一种将大...

    c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构

    在C语言中,分治法是一种强大的算法设计策略,它将复杂的问题分解为较小的子问题,然后分别解决这些子问题,最后将结果合并得到原问题的解。递归是实现分治法的一种常见手段,它允许函数调用自身来处理更小规模的...

    LCA.zip_C++_JDI_LCA_lca并查集_分治思想

    本文将详细讨论如何使用C++编程语言,结合分治思想和并查集数据结构来解决LCA问题。 首先,我们要理解什么是最近公共祖先。在一颗树(无环有向图)中,给定两个节点u和v,它们的最近公共祖先是指离它们最近的共同...

    分治法求最大

    分治法是计算机科学中一种重要的算法思想,它将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这种策略在处理大规模数据时特别有效,能够...

    五大算法基本思想—分治,动态规划,贪心,回溯,分支界限,算法数据结构

    本文将深入探讨五大基础算法思想:分治、动态规划、贪心、回溯和分支界限,并与数据结构相结合,帮助我们理解和应用这些算法。 一、分治法 分治法是一种将复杂问题分解为较小、独立且相似的子问题的策略,然后对子...

    点分治_点分治模板_

    点分治的基本思想是将复杂的问题分解为若干个独立的部分,通过解决这些小问题来推导出原问题的解。在信息学奥林匹克竞赛中,点分治常用于解决与树或图的子结构有关的问题,如最短路径、最小生成树、区间覆盖等。 **...

    分治法的一组应用(共8个)

    每个问题都有其特点和难点,但都是通过分治思想来解决的。 1. 取余运算 这是一个典型的分治问题。该问题的难点在于数据规模很大,需要用到进制转换的思想和二分法来解决。通过引入原理 a*b mod k = (a mod k) * (b...

    分治算法求最大值与最小值,找最小元素

    这两个问题都可以通过分治思想进行有效解决。 首先,寻找最大值和最小值。传统的做法是遍历整个数组,但采用分治法可以更快地完成这一任务。基本步骤如下: 1. 将数组分为两个相等(或近乎相等)的部分。 2. 分别...

Global site tag (gtag.js) - Google Analytics