java投硬币题目

Python045

java投硬币题目,第1张

硬币面枚举:

public enum CoinSide {

    HEAD(0), TAIL(1)

    private int value

    CoinSide(int value) {

        this.value = value

    }

}

2.硬币

import java.util.Random

public class Coin {

    private String name

    private CoinSide coinSide

    public Coin(String name) {

        this.name = name

    }

    public CoinSide getCoinSide() {

        return coinSide

    }

    public void setCoinSide(CoinSide coinSide) {

        this.coinSide = coinSide

    }

    public CoinSide tossCoin() {

        Random random = new Random()

        int value = random.nextInt(2)

        if (value == 0) {

            this.coinSide = CoinSide.HEAD

        } else {

            this.coinSide = CoinSide.TAIL

        }

        this.printCoinSide()

        return this.coinSide

    }

    public void printCoinSide() {

        System.out.println(this.name + " toss " + this.coinSide.name())

    }

}

3.主类

public class Main {

    public static void main(String[] args) {

        Coin coin1 = new Coin("coin1")

        Coin coin2 = new Coin("coin2")

        while (true) {

            coin1.tossCoin()

            coin2.tossCoin()

            if (coin1.getCoinSide() == coin2.getCoinSide() && coin1.getCoinSide() == CoinSide.TAIL) {

                break

            }

            System.out.println("-------------------")

        }

    }

}

运行演示:

import java.io.IOException

import java.util.HashMap

import java.util.HashSet

import java.util.Map.Entry

import java.util.Scanner

public class Test {

static HashSet<Integer[]> resultSet = new HashSet<Integer[]>()//存放结果  

static HashMap<Integer, Integer> coinsMap//将硬币分类 种类——数量

static int max = 0

public static void main(String[] args) throws IOException {

int coins[] = {1,1,2,2,4,4,8,8}//硬币集合

// Scanner sc = new Scanner(System.in)

// int n = sc.nextInt()//输入n的值

int n = 16

count(coins, n)

System.out.println()

System.out.println(resultSet.size())

/* 输出结果  每种硬币的数量*/

for(Integer[] ints : resultSet){

int i = 0

for(Entry<Integer, Integer> entry : coinsMap.entrySet()){

System.out.println("coins:" + entry.getKey() + " num:" + ints[i++] )

}

System.out.println()

}

}

/**

 * 将硬币归类并统计每类的数量

 * @param coins

 * @param n

 * @throws IOException

 */

public static void count(int[] coins, int n) throws IOException{

coinsMap = new HashMap<Integer,Integer>()

for(int i = 0i < coins.lengthi ++){

int count = 0

if(coinsMap.containsKey(coins[i])){

count = coinsMap.get(coins[i])

}

++ count

max += coins[i]

coinsMap.put(coins[i], count)

}

Integer[][] pool = new Integer[coinsMap.size()][2]

int index = 0

for(Entry<Integer, Integer> entry: coinsMap.entrySet()){

pool[index][0] = entry.getKey()

pool[index][1] = entry.getValue()

index ++

}

if(n > max){

System.out.println("超过所以硬币总额")

}

else{

recursive(pool, 0, 0, n,new Integer[pool.length])

}

}

/**

 * 利用递归的方式求硬币的组合

 * @param pool

 * @param coin

 * @param sum

 * @param n

 * @param result

 * @throws IOException

 */

public static void recursive(Integer[][] pool,int coin,int sum,int n,Integer result[]) throws IOException{

if(coin == pool.length){//已经考虑了所以种类的硬币时,结束递归

return

}

int tSum = sum

for(int i = 0i <= pool[coin][1]i ++){

int temp = i * pool[coin][0]

tSum = sum + temp

Integer[] _result = new Integer[pool.length]

for(int j = 0 j < coinj ++){

_result[j] = result[j]

}

_result[coin] = i

// for(int k = 0k < coink++) System.out.print(" ")

// System.out.println("coin:"+pool[coin][0] + " num:"+ i + "  " + sum + "_" + tSum + " "  )

if(tSum == n && coin == pool.length - 1){//已经考虑到最后一种硬币类型且硬币组合的面值与n相等

resultSet.add(_result)

// System.out.println("here is an answer")

}

else{

recursive(pool, coin + 1, tSum, n, _result)

}

}

}

}

好久没写这种的,写了好久。如有不对,欢迎指正!

import java.util.ArrayList

/*

 * 一元钱硬币有多少种表达方式 

 * 可供选择:1分,2分,5分,1角,2角,5角,1元

 * 如:

 * 1元=1元

 * 1元=5角+5角

 * .... 

 */

public class Test {

 private static int count

 public static void main(String args[]){

 int max = 100//一元

 int[] cents = {100,50,20,10,5,2,1}//币值

 String[] money = {"1元","5角","2角","1角","5分","2分","1分"}

 ArrayList collect = new ArrayList()

 collectMoney(cents, money,0, max, 0, collect)

 System.out.println("总共有"+count+"种搭配方法!")

 }

 public static void collectMoney(int[] cents,String[] money,int beginIndex,int max,int result,ArrayList collect){

 if(result&gt=max){

 if(result==max){

 count++

 System.out.print("1元=")

 for(int i=0i&ltcollect.size()i++){

 System.out.print(money[(Integer) collect.get(i)])

 if(i&ltcollect.size()-1){

 System.out.print("+")

 }

 }

 System.out.println()

 }

 return

 }

 for(int i=beginIndexi&ltcents.lengthi++){

 int cent = cents[i]

 collect.add(i)

 collectMoney(cents, money,i, max, result+cent, collect)

 collect.remove(Integer.valueOf(i))

 }

 }

}