黑马程序员技术交流社区
标题:
答题贴
[打印本页]
作者:
刘胜寒
时间:
2013-6-1 12:07
标题:
答题贴
本帖最后由 刘胜寒 于 2013-6-5 17:11 编辑
直接贴代码,贴代码。
严禁使用压缩文件;
周末有奖问答之三
问题贴:
http://bbs.itheima.com/thread-53304-1-1.html
活动有效期周一晚八点。
作者:
吴文彬
时间:
2013-6-1 14:31
package cn.itcast.test;
import java.util.Scanner;
public class FindTheFalseCoinDemo {
public static final int N = 16;
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
while (cin.hasNext()) {
String[] left = new String[3];
String[] right = new String[3];
String[] result = new String[3];
for (int i = 0; i < 3; i++) {// 输入三种状态.
left[i] = cin.next();
right[i] = cin.next();
result[i] = cin.next();
}
deal(left, right, result); // 处理部分.
}
}
public static void deal(String[] left, String[] right, String[] result) {
for (int i = 0; i < 12; i++) { // 枚举第i枚为假币
for (int j = 0; j < 2; j++) {// 枚举第i枚假币比真币轻还是重(0 代表轻, 1代表重)
int[] coins = new int[12]; // 代表各硬币的重量.
if (j == 0)
coins[i] = -1;
else
coins[i] = 1;
if (judgeIfSatisfiedCondition(left, right, result, coins)) { // 如果枚举第i枚为假币,并且为(轻 或 重)币时,满足条件,输出答案。 // 或 // 重),满足条件,输出.
System.out.println((char) ('A' + i) + "为假币,比真币" + (j == 0 ? "轻." : "重."));
break;
}
}
}
}
public static boolean judgeIfSatisfiedCondition(String[] left,
String[] right, String[] result, int[] coins) {
for (int i = 0; i < 3; i++) {
char[] leftArr = left[i].toCharArray();
char[] rightArr = right[i].toCharArray();
int leftWeight = 0;
int rightWeight = 0;
for (int l = 0; l < leftArr.length; l++) {// 计算出左右两边的各种重量之和。
leftWeight += coins[leftArr[l] - 'A'];
rightWeight += coins[rightArr[l] - 'A'];
}
if (result[i].equals("even") && (leftWeight == rightWeight)) {
continue;
} else if (result[i].equals("up") && (leftWeight > rightWeight)) {
continue;
} else if (result[i].equals("down") && (leftWeight < rightWeight)) {
continue;
} else {//三次里有一次,不满足,直接返回不满足。
return false;
}
}
return true;//三个表达式都满足,返回true。
}
}
// 楼主 哪些地方,哪些地方扣分了,说明下哈。 谢谢了。
作者:
骑上最爱
时间:
2013-6-1 15:06
public class TrueFalseMoney {
public static void main(String[] args) {
TianPing tp = new TianPing();
//先把12枚钱币分成2份,先假设假币是比较轻的
tp.left(Money.A, Money.B, Money.C, Money.D, Money.E, Money.F);
tp.right(Money.G, Money.H, Money.I, Money.J, Money.K, Money.L);
System.out.println("ABCDEF " + "GHIJKL " + tp.show());
//显示的结果为右up,说明假币在右托盘上,然后把这6个钱币放在天平上
tp.left(Money.G, Money.H, Money.I);
tp.right(Money.J, Money.K, Money.L);
System.out.println("GHI " + "JKL " + tp.show());
//显示的结果为左down,说明假币在左托盘上,然后把这3个钱币放在天平上
tp.left(Money.G);
tp.right(Money.H);
System.out.println("G " + "H " + tp.show());
//显示的结果为中even,说明剩下的那个就是假币
System.out.println(Money.I + "为假币,比真币轻。");
}
}
//定义12枚硬币。
enum Money{
A {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, B {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, C {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, D {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, E {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, F {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, G {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, H {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, I {
@Override
public double weight() {
// TODO Auto-generated method stub
return 1.9;
}
}, J {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, K {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
}, L {
@Override
public double weight() {
// TODO Auto-generated method stub
return 2;
}
};
public abstract double weight();
}
//定义一个天平
class TianPing{
private double leftweight;
private double rightweight;
//天平的左托盘
public void left(Money... m){
leftweight = 0;
for (int i = 0; i < m.length; i++) {
leftweight += m[i].weight();
}
}
//天平的右托盘
public void right(Money... m){
rightweight = 0;
for (int i = 0; i < m.length; i++) {
rightweight += m[i].weight();
}
}
//天平的显示盘
public String show(){
if(leftweight > rightweight)
return "up";
else if(leftweight < rightweight)
return "down";
else
return "even";
}
}
复制代码
作者:
刘海芳
时间:
2013-6-1 15:34
package com.itheima;
import java.util.Scanner;
/**
* 此题中赛利已经设计了正确的称量方案,保证从三组称量数据中能得到唯一的答案。
* 答案可以用两个变量表示:x-假币的标号、w-假币是比真币轻还是比真币重。x共有12种猜测;
* w有2种猜测。根据赛利设计的称量方案,(x,w)的24种猜测中,只有唯一的猜测与三组称量数据都不矛盾。
* 因此,如果猜测(x,w )满足下列条件,这个猜测就是要找的答案:
在称量结果为"even'' 的天平两边,没有出现x ;
如果w表示假币比真币轻,则在称量结果为"up'' 的天平右边一定出现x、在称量结果为"down'' 的天平左边一定出现x;
如果w表示假币比真币重,则在称量结果为"up'' 的天平左边一定出现x、在称量结果为"down'' 的天平右边一定出现x。
* @author acser
*
*/
public class Test11{
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int N=cin.nextInt();
int[][] coin=new int[N][12];
String[][] left=new String[N][3];
String[][] right=new String[N][3];
String[][] balance=new String[N][3];
int[] ccc=new int[N];
for(int i=0;i<N;i++) { //输入
for(int j=0;j<3;j++) {
left[i][j]=cin.next();
right[i][j]=cin.next();
balance[i][j]=cin.next();
}
}
for(int i=0;i<N;i++) { //真假币判断逻辑 。。。
ccc[i]=0;
for(int j=0;j<12;j++) coin[i][j]=0;
for(int j=0;j<3;j++) { // 判断是否与三次称量结果矛盾
if(balance[i][j].equals("even")) { //在称量结果为"even'' 的天平两边,没有出现x ;
char[] leftName =left[i][j].toCharArray();
char[] rightName =right[i][j].toCharArray();
for(int p=0;p<4;p++) {
coin[i][(int)(leftName[p]-'A')]+=1;
coin[i][(int)(rightName[p]-'A')]+=1; } }
else {
char[] leftName =left[i][j].toCharArray();
char[] rightName =right[i][j].toCharArray();
for(int p=0;p<4;p++) {
coin[i][(int)(leftName[p]-'A')]-=1;
coin[i][(int)(rightName[p]-'A')]-=1; }
ccc[i]--;
}
}
}
for(int i=0;i<N;i++) { //输出
for(int j=0;j<coin[i].length;j++)
if(coin[i][j]==ccc[i]) {
char t=(char)(j+'A');
System.out.println(t+" 为假币,比真币轻");
}
}
}
}
复制代码
作者:
进击的SJ君
时间:
2013-6-1 17:17
public class A {
private static int C,B,D,E,F,G,H,I,J,K,L=1;
private static int A=2;
public static void main(String args[]){
if(A+B+C+D>E+F+G+H){//I,J,K,L为真币
if(A+F+G+H==E+I+J+K){//B,C,D有问题,且假币比真币重
if(B>C){
System.out.println("B为假币,比真币重.");
}else if(B<C){
System.out.println("C为假币,比真币重.");
}else{
System.out.println("D为假币,比真币重.");
}
}else if(A+F+G+H>E+I+J+K){//A,E有问题
if(A==I){
System.out.println("E为假币,比真币轻.");
}else{//A>I
System.out.println("A为假币,比真币重.");
}
}else{//A+F+G+H<E+I+J+K ,F,G,H有问题,且假币比真币轻
if(F>G){
System.out.println("G为假币,比真币轻.");
}else if(F<G){
System.out.println("F为假币,比真币轻.");
}else{
System.out.println("H为假币,比真币轻.");
}
}
}else if(A+B+C+D<E+F+G+H){//I,J,K,L为真币
if(A+F+G+H==E+I+J+K){//B,C,D有问题,且假币比真币轻
if(B>C){
System.out.println("C为假币,比真币轻");
}else if(B<C){
System.out.println("B为假币,比真币轻.");
}else{
System.out.println("D为假币,比真币轻.");
}
}else if(A+F+G+H>E+I+J+K){//F,G,H有问题,,且假币比真币重
if(F>G){
System.out.println("F为假币,比真币重.");
}else if(F<G){
System.out.println("G为假币,比真币重.");
}else{
System.out.println("H为假币,比真币重.");
}
}else{//A+F+G+H<E+I+J+K ,A,E有问题
if(A==I){
System.out.println("E为假币,比真币重.");
}else{//A<I
System.out.println("A为假币,比真币轻.");
}
}
}else {
//A+B+C+D==E+F+G+H,A-H为真币,取3个真币A,B,C作比较
if(A+B+C==I+J+K){
//I,J,K为真币,取一个真币与剩下的一个作比较
if(A>L){
System.out.println("L为假币,比真币轻.");
}else{
System.out.println("L为假币,比真币重.");
}
}else if(A+B+C>I+J+K){
//取I,J,K其中2个作比较
if(I==J){
System.out.println("K为假币,比真币轻.");
}else if(I>J){
System.out.println("J为假币,比真币轻.");
}else{
System.out.println("I为假币,比真币轻.");
}
}else{ //A+B+C<I+J+K
//取I,J,K其中2个作比较
if(I==J){
System.out.println("K为假币,比真币重.");
}else if(I>J){
System.out.println("I为假币,比真币重.");
}else{
System.out.println("J为假币,比真币重.");
}
}
}
}
}
复制代码
作者:
kaka小明
时间:
2013-6-1 18:30
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/*
* 鉴别假币问题:
* 解题思路:
* 1,将银币分三等份,进行4对4比较,最重的那一组含有假币
* 2.对这一组进行4选2,2选一筛选,因为筛选流程一样,可用递归实现。
* 这里将银币资源封装在HsahMap中,键值为银币代号,值为重量,真币为1,假币为2,
* 第一步筛选过程主要是根据输入的字串进行键集合的踢出处理,根据字串进行两组银币重量的比较,最后获得有效的集合并将其转换成字串。
* 第二步主要负责递归比较重量,并得到最终结果。
*/
public class Main {
private static HashMap<String, Integer> coinSet;
public static void main(String[] args){
initCoinSet();
System.out.println(getWeight(coinSet));
try {
String rank1res=rank1Filter(coinSet);
System.out.println("第一次筛选结果:"+rank1res);
String rank2res=rank2Filter(rank1res);
System.out.println("筛选结果:"+rank2res+",假币较重");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void initCoinSet(){
coinSet=new HashMap<String, Integer>();
for(char x='A';x<='L';x++){
if(x!='D'){
coinSet.put(x+"",1);
}else{
coinSet.put(x+"", 2);
}
}
}
//第一次筛选分三组,进行4-4比较,选出含有假币的4个银币,返回是银币代号集合
public static String rank1Filter(HashMap<String, Integer> coinSet) throws IOException{
int weight1=0;
int weight2=0;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
String[] subStrings=null;
System.out.println("请将A-L任意分成三等份,并选取其中两组进行比较。组组之间用逗号隔开。。");
line=br.readLine();
subStrings=line.split(",");
weight1=getWeight(subStrings[0], coinSet);
weight2=getWeight(subStrings[1], coinSet);
if(weight1>weight2){
System.out.println("第一次比较结果:"+"up");
return subStrings[0];
}else if(weight1==weight2){
System.out.println("第一次比较结果:"+"even");
//如果比较两组重量相等,则假币必定存在第三组中,这里做"差集处理"
Set<String> set=coinSet.keySet();
//将两组无效组从代号集合中踢出。
set.removeAll(stringToSet(subStrings[0]+subStrings[1]));
//返回有效组的字串
return setToString(set);
}
return subStrings[0];
}
//递归进行4选2及2选一的比较
public static String rank2Filter(String rank1res) throws IOException{
//两边的重量
int weight1=0;
int weight2=0;
String result=null;//暂存筛选结果
//键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
String[] subStrings=null;
System.out.println("请将"+rank1res+"任意分成两等份进行比较。组组之间用逗号隔开。。");
line=br.readLine();
subStrings=line.split(",");
//获得两组的重量
weight1=getWeight(subStrings[0], coinSet);
weight2=getWeight(subStrings[1], coinSet);
//二者取其重者
if(weight1>weight2){
System.out.println("比较结果:"+"up");
result= subStrings[0];
}else{
System.out.println("比较结果:"+"down");
result= subStrings[1];
}
//筛选到最后一个字符,则筛选结束
if((result!=null)&&(result.length()==1)){
System.out.println("筛选成功!");
return result;
}
//否则继续筛选。
return rank2Filter(result);
}
//获得银币集合中的总重量
public static int getWeight(HashMap<String, Integer> coinSet){
Set<String> keySet=coinSet.keySet();
Iterator<String> it=keySet.iterator();
int weight=0;
while(it.hasNext()){
weight+=coinSet.get(it.next());
}
return weight;
}
//获得字串s中包含银币的总重量
public static int getWeight(String s,HashMap<String, Integer> coinSet){
int weight=0;
char[] chars=s.toCharArray();
for(char c:chars){
weight+=coinSet.get(c+"");
}
return weight;
}
//获得MAP中银币的重量
public static void sop(HashMap<String, Integer> coinSet){
System.out.println(coinSet);
}
//字串转换成集合
public static Set<String> stringToSet(String s){
TreeSet<String> ts=new TreeSet<String>();
char[] chars=s.toCharArray();
for(char x:chars){
ts.add(x+"");
}
return ts;
}
//集合中的字串组装
public static String setToString(Set<String> set){
Iterator it=set.iterator();
StringBuilder sb=new StringBuilder();
while(it.hasNext()){
sb.append(it.next());
}
return sb.toString();
}
}
作者:
ccywhut
时间:
2013-6-1 19:46
本帖最后由 ccywhut 于 2013-6-1 19:48 编辑
代码马马虎虎能用,封装的不好
/*将12枚银币(A-L)分成三组,每组四个,第一次天平两端各放4枚银币
* (A-D和E-H,即是标号0-3和4-7)如果平衡,
进入twelveCoins1。如果不平衡进入twelveCoins2,twelveCoins3.
*/
public class Goodden {
public static void main(String[] args) {
start();
}
//打印出标号和位置。
public static void start(){
Goodden g1=new Goodden();
int A,B,C,D,E,F,G,H,I,J,K,L;
A=B=E=D=F=G=H=I=C=L=K=3;
J=5; //设定初始重量值
int[] coins1=new int[]{A,B,C,D,E,F,G,H,I,J,K,L};
int f=g1.twelveCoins1(coins1)+g1.twelveCoins2(coins1)+g1.twelveCoins3(coins1);
for(int i=0;i<12;i++){
if(coins1
==f){
char t=(char)(65+i);
pr(",她是标号为"+t+",是第"+(i+1)+"个元素");
}
}
}
/*标号0-3和4-7两端平衡,从中取出三枚银币(8-10)和三枚银币(0-3)
* (已经认定是真银币)比较。
* 如果平衡,球11是假银币.
。如果不平衡,则可以断定假银币是比真银币重还是轻
*/
public int twelveCoins1(int[] coins){
int f=0;
if(coins[0]+coins[1]+coins[2]+coins[3]==coins[4]+coins[5]+coins[6]+coins[7]){
//平衡
if(coins[8]+coins[9]+coins[10]==coins[0]+coins[1]+coins[2]){
f= coins[11];//球11是假银币,与真银币相比较。
if(f>coins[8])pr2(f);
else pr1(f);
return f;
}
//如果三枚银币(8-10)重量大于三枚银币(0-3),假银币在8-10中
else if(coins[8]+coins[9]+coins[10]>coins[0]+coins[1]+coins[2]){
if(coins[8]==coins[9]){
f=coins[10];
pr2(f);
return f;
}else if(coins[8]>coins[9]){
f=coins[8];
pr2(f);
return f;
}else{
f=coins[9];
pr2(f);
return f;
}
//如果三枚银币(8-10)重量小于三枚银币(0-3),假银币在8-10中
}else if(coins[8]+coins[9]+coins[10]<coins[0]+coins[1]+coins[2]){
if(coins[8]==coins[9]){
f=coins[10];
pr1(f);
return f;
}else if(coins[8]<coins[9]){
f=coins[8];
pr1(f);
return f;
}else{
f=coins[9];
pr1(f);
return f;
}
}
}
return f;
}
//*标号0-3和4-7两端不平衡
public int twelveCoins2(int[] coins){
int f=0;
if(coins[0]+coins[1]+coins[2]+coins[3]>coins[4]+coins[5]+coins[6]+coins[7]){
/*//从中取出四枚银币(3,8-10)和四枚银币(0,1,2,4)比较。
* 如果平衡,假银币在5-7之间.*/
if(coins[0]+coins[1]+coins[2]+coins[4]==coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[5]==coins[6]) {
f=coins[7];
pr1(f);
return f;
}else if (coins[5]>coins[6]){
f=coins[6];
pr1(f);
return f;
}else{
f=coins[5];
pr1(f);
return f;
}
}
//如果四枚银币(3,8-10)小于三枚银币(0,1,2,4),假银币在0-1之间.
else if(coins[0]+coins[1]+coins[2]+coins[4]>coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[0]==coins[1]) {
f=coins[2];
pr2(f);
return f;
}else if (coins[0]>coins[1]){
f=coins[0];
pr2(f);
return f;
}else{
f=coins[1];
pr2(f);
return f;
}
}
//如果四枚银币(3,8-10)大于三枚银币(0,1,2,4),假银币在3-4之间.
else if(coins[0]+coins[1]+coins[2]+coins[4]<coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[4]==coins[1]) {
f=coins[3];
pr2(f);
return f;
}else{
f=coins[4];
pr1(f);
return f;
}
}
}
return f;
}
//*标号0-3和4-7两端不平衡
public int twelveCoins3(int[] coins){
int f=0;
if(coins[0]+coins[1]+coins[2]+coins[3]<coins[4]+coins[5]+coins[6]+coins[7]){
/*从中取出四枚银币(3,8-10)和四枚银币(0,1,2,4)比较。
如果平衡,假银币在5-7之间.比较5,6.*/
if(coins[0]+coins[1]+coins[2]+coins[4]==coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[5]==coins[6]) {
f=coins[7];
pr2(f);
return f;
}else if (coins[5]>coins[6]){
f=coins[5];
pr2(f);
return f;
}else{
f=coins[6];
pr2(f);
return f;
}
}
// 如果四枚银币(3,8-10)大于三枚银币(0,1,2,4),假银币在0-2之间,比较0,1.
else if(coins[0]+coins[1]+coins[2]+coins[4]<coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[0]==coins[1]) {
f=coins[2];
pr1(f);
return f;
}else if (coins[0]>coins[1]){
f=coins[1];
pr1(f);
return f;
}else{
f=coins[0];
pr1(f);
return f;
}
}
//如果四枚银币(3,8-10)小于三枚银币(0,1,2,4),假银币在3-4之间,银币。
else if(coins[0]+coins[1]+coins[2]+coins[4]>coins[3]+coins[8]+coins[9]+coins[10]){
if( coins[4]==coins[1]) {
f=coins[3];
pr1(f);
return f;
}else{
f=coins[4];
pr2(f);
return f;
}
}
}
return f;
}
public static void pr(Object obj){
System.out.print(obj);
}
public static void pr1(Object obj){
System.out.print("银币中找出的结果是:重量为"+obj+"是假币,它比真币轻");
}
public static void pr2(Object obj){
System.out.print("银币中找出的结果是:重量为"+obj+"是假币,它比真币重");
}
}
作者:
何俊森
时间:
2013-6-1 23:00
本帖最后由 何俊森 于 2013-6-1 23:02 编辑
import java.util.Scanner;
import java.util.SortedSet;
import java.util.TreeSet;
public class CoinFakeTest {
/**
* 解题思路:对于每一次测量,发现天平平衡,说时两边的银币都是真币,存到集合中,然后在所有的银币里排除掉这些真的银币。在用剩下的可能的假币一一去判断,
* 若出现那一次不平衡的测量中,说明 这个银币是假币。
*/
public static void main(String[] args) {
// 读取输入语句
Scanner scan = new Scanner(System.in);
String str1 = scan.nextLine();
String str2 = scan.nextLine();
String str3 = scan.nextLine();
char[] realCoins = new char[16];
String coins = new String("ABCDEFGHIJKL");
char fakeCoin = 0;// 假银币
SortedSet<Character> allCoins = new TreeSet<Character>();
// 判断第几次称量出现产平衡,对三条语句进行判断
if (str1.endsWith("up") || str1.endsWith("down")) {
String cStr2 = str2.replace(" ", "").replace("even", "");// 取出真币
cStr2.getChars(0, cStr2.length(), realCoins, 0);
String cStr3 = str3.replace(" ", "").replace("even", "");
cStr3.getChars(0, cStr3.length(), realCoins, 8);
for (int i = 0; i < realCoins.length; i++) {// 取出真币存到集合中
allCoins.add(realCoins[i]);
}
String s = coins;
for (char ch : allCoins) {// 在所有币中去除真币,剩下的是可能的假币
if (coins.contains(ch + "")) {
s = s.replace(ch + "", "");
}
}
char[] fakeCoins = new char[s.length()];
s.getChars(0, s.length(), fakeCoins, 0);
for (int i = 0; i < fakeCoins.length; i++) {
if (str1.contains(fakeCoins[i] + "")) {// 从剩下可能的假币里判断哪个是假币,当这个可能的假币出现在不平衡的那一次衡量里,则说明是假币
fakeCoin = fakeCoins[i];
}
}
if (str1.indexOf(fakeCoin) > 4) {// 判断假币重量比真币重还是轻
if (str1.endsWith("up")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
} else if (str1.indexOf(fakeCoin) < 4) {
if (str1.endsWith("down")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
}
}
if (str2.endsWith("up") || str2.endsWith("down")) {
String cStr1 = str1.replace(" ", "").replace("even", "");
// System.out.println(cStr2);
cStr1.getChars(0, cStr1.length(), realCoins, 0);
String cStr3 = str3.replace(" ", "").replace("even", "");
cStr3.getChars(0, cStr3.length(), realCoins, 8);
for (int i = 0; i < realCoins.length; i++) {
allCoins.add(realCoins[i]);
}
// System.out.println(allCoins);
String s = coins;
for (char ch : allCoins) {
if (coins.contains(ch + "")) {
s = s.replace(ch + "", "");
}
}
char[] fakeCoins = new char[s.length()];
s.getChars(0, s.length(), fakeCoins, 0);
for (int i = 0; i < fakeCoins.length; i++) {
if (str2.contains(fakeCoins[i] + "")) {
fakeCoin = fakeCoins[i];
}
}
if (str2.indexOf(fakeCoin) > 4) {
if (str2.endsWith("up")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
} else if (str2.indexOf(fakeCoin) < 4) {
if (str2.endsWith("down")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
}
}
if (str3.endsWith("up") || str3.endsWith("down")) {
String cStr2 = str2.replace(" ", "").replace("even", "");
// System.out.println(cStr2);
cStr2.getChars(0, cStr2.length(), realCoins, 0);
String cStr1 = str1.replace(" ", "").replace("even", "");
cStr1.getChars(0, cStr1.length(), realCoins, 8);
for (int i = 0; i < realCoins.length; i++) {
allCoins.add(realCoins[i]);
}
// System.out.println(allCoins);
String s = coins;
for (char ch : allCoins) {
if (coins.contains(ch + "")) {
s = s.replace(ch + "", "");
}
}
char[] fakeCoins = new char[s.length()];
s.getChars(0, s.length(), fakeCoins, 0);
for (int i = 0; i < fakeCoins.length; i++) {
if (str3.contains(fakeCoins[i] + "")) {
fakeCoin = fakeCoins[i];
}
}
if (str3.indexOf(fakeCoin) > 4) {
if (str3.endsWith("up")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
} else if (str3.indexOf(fakeCoin) < 4) {
if (str3.endsWith("down")) {
System.out.println(fakeCoin + "为假币,比真币" + "轻.");
} else {
System.out.println(fakeCoin + "为假币,比真币" + "重.");
}
}
}
}
}
复制代码
作者:
yin1031468524
时间:
2013-6-1 23:44
package com.itheima;
public class Coin
{
/**
* 此题给出的称量方案数据已保证三次称量后答案唯一,我们可以考虑使用枚举法,对每一枚硬币先假设它是轻的,
* 看这样是否符合称量结果。如果符合,问题即解决。不符合,就假设它是重的,看是否符合称量结果,
* 把所有硬币都试一遍,一定能找到特殊的硬币
*
*/
private char left[][] =
{
{ 'A', 'B', 'C', 'D' },
{ 'A', 'B', 'C', 'I' },
{ 'A', 'B', 'I', 'J' } };// 定义样例输入中左边三次的称量结果
private char right[][] =
{
{ 'E', 'F', 'G', 'H' },
{ 'E', 'F', 'J', 'K' },
{ 'E', 'F', 'G', 'H' } };// 定义样例输入中右边三次的称量结果
private char result[][] =
{
{ 'e' },
{ 'u' },
{ 'e' } };// 定义样例输入中三次称量右边的结果右端高(u)、右端低(d),平衡(e)
public static void main(String[] args)
{
Coin coin = new Coin(); // 创建Coin对象调用它的isLight和isRight方法
// 逐一枚举硬币
for (char c = 'A'; c <= 'L'; c++)
{
if (coin.isLight(c))
{
System.out.println(c + "为假币,比真币轻");
break;
} else if (coin.isHeavy(c))
{
System.out.println(c + "为假币,比真币重");
break;
}
}
}
// 判断硬币x是否为轻的代码
public boolean isLight(char x)
{
for (int i = 0; i < 3; i++)// 判断是否与三次称量结果矛盾
{
switch (result[i][0])
{
case 'u':
if (!inRight(i, x))
return false;
break;
case 'e':
if (inRight(i, x) || inLeft(i, x))
return false;
break;
case 'd':
if (!inLeft(i, x))
return false;
break;
}
}
return true;
}
// 判断硬币x是否为重的代码
public boolean isHeavy(char x)
{
for (int i = 0; i < 3; i++)// 判断是否与三次称量结果矛盾
{
switch (result[i][0])
{
case 'd':
if (!inRight(i, x))
return false;
break;
case 'e':
if (inRight(i, x) || inLeft(i, x))
return false;
break;
case 'u':
if (!inLeft(i, x))
return false;
break;
}
}
return true;
}
// 判断硬币x是否在第i次称量左侧
public boolean inLeft(int i, char x)
{
for (int j = 0; j < left[i].length; j++)
{
if (left[i][j] == x)
{
return true;
}
}
return false;
}
// 判断硬币x是否在第i次称量右侧
public boolean inRight(int i, char x)
{
for (int j = 0; j < right[i].length; j++)
{
if (right[i][j] == x)
{
return true;
}
}
return false;
}
}
复制代码
作者:
董赛媛
时间:
2013-6-2 15:44
本帖最后由 董赛媛 于 2013-6-2 15:55 编辑
import java.util.Scanner;
public class Coin {
public static void main(String[] args){
//存储天平左边的硬币
String[] left = new String[3];
//存储天平右边的硬币
String[] right = new String[3];
//存储天平的平衡状态
String[] res = new String[3];
//用Scanner进行字符串输入
Scanner cin = new Scanner(System.in);
while(cin.hasNext())
{
//称3次
for(int i = 0; i < 3; i++)
{
left
= cin.next();
right
= cin.next();
res
= cin.next();
}
//tCoin用来存储真币,并假设刚开始都为false即为假币
boolean[] tCoin = new boolean[12];
//fCoin用来存储假币,并假设刚开始都为false即为真币
boolean[] fCoin = new boolean[12];
//循环遍历硬币
for(int i = 0; i < 3; i++)
{
//当平衡状态为even时则两边的都是真币并标记记录
if(res
.equals("even"))
{
for(int j = 0; j < left
.length(); j++)
{
//在平衡状态中的硬币都是真硬币,则更新标记真假硬币数组
tCoin[left
.charAt(j) - 'A'] = true;
fCoin[left
.charAt(j) - 'A'] = false;
}
for(int j = 0; j< right
.length(); j++)
{
tCoin[right
.charAt(j) - 'A'] = true;
fCoin[right
.charAt(j) - 'A'] = false;
}
}
//当前状态肯定为非平衡,表示有假币,但是并不清楚哪颗是假的所以用真币去一一对比
else
{
for(int j = 0; j < left
.length(); j++)
{
//在真币数组中能找到该硬币说明该硬币为真,则可以直接比较下一个了
if(tCoin[left
.charAt(j) - 'A'])
continue;
//在真币数组中没能找到该硬币说明该硬币可能为假,则在假硬币数组中标记一下
fCoin[left
.charAt(j) - 'A'] = true;
}
for(int j = 0; j< right
.length(); j++)
{
if(tCoin[right
.charAt(j) - 'A'])
continue;
fCoin[right
.charAt(j) - 'A'] = true;
}
}
}
//一共有12颗硬币
//找出哪颗是假币并保存到pos变量中以便接下来在遍历中能明确假币出现在哪一端和当时的平衡状态
//pos + 'A' 即为假币
int pos;
for(pos = 0; pos < 12; pos++)
{
//找到假币就跳出循环
if(fCoin[pos] == true)
break;
}
//用来记录是否找到假币
boolean flag = false;
//state指假币位于左边还是右边,左边为1,右边为2
int state = 0;
int i, j;
//遍历全部硬币来明确假币出现在哪一端和当时的平衡状态
for(i = 0; i < 3 && !flag; i++)
{
//遍历天平左边的硬币
for(j = 0; j < left
.length() && !flag; j++)
{
//找到假币并且是在左边的
if(left
.charAt(j) - 'A' == pos)
{
state = 1;
flag = true;
}
}
//遍历天平右边的硬币
for(j = 0; j < right
.length() && !flag; j++)
{
//找到假币并且是在右边的
if(right
.charAt(j) - 'A' == pos)
{
state = 2;
flag = true;
}
}
//找到假币,跳出循环
if(flag) break;
}
//输出哪颗是假币 假币是(char)(pos + 'A')
System.out.print((char)(pos + 'A') + "币为假币,");
//右端比较高的情况
if(res
.equals("up"))
{
//假币在左边的情况
if(state == 1)
System.out.println("比真币重.");//若右端比较高而且假币在左边则假币一定比真币重
//假币在右边边的情况
else
System.out.println("比真币轻.");//若右端比较高而且假币在右边则假币一定比真币轻
}
//左端比较高的情况
else
{
//假币在左边的情况
if(state == 1)
System.out.println("比真币轻.");//若左端比较高而且假币在左边则假币一定比真币轻
//假币在右边边的情况
else
System.out.println("比真币重.");//若左端比较高而且假币在右边则假币一定比真币重
}
}
}
}
作者:
First
时间:
2013-6-3 09:39
本帖最后由 First 于 2013-6-3 09:55 编辑
package test;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyDemo().show();
}
}
class MyDemo{
int[] list = new int[12];
int[] only = new int[]{-1,1};// 值为-1 即为轻,值为1 即为重。
public void show() {
//随机产生a-l中的一个假币,随机使得假币过重或过轻。
list[(int)(Math.random()*12)] = only[(int)(Math.random()*2)];
//list[0] = 1; 该语句用于检测对错,改变list 的指针及对应的其值 即可检测24种情况。
//字母与硬币相对应。
int a = list[0];
int b = list[1];
int c = list[2];
int d = list[3];
int e = list[4];
int f = list[5];
int g = list[6];
int h = list[7];
int i = list[8];
int j = list[9];
int k = list[10];
int l = list[11];
int test1 = (a+b+c+d)-(e+f+g+h);//第一次称重比较
int test2 = (a+b+c+e)-(i+j+k+d);//第二次称重比较
if(test1 > 0){//第一次为 up
if(test2 > 0){//第二次为 up
int test3 = (i+j+k+a) - (e+f+g+b);//第三次称重比较
if(test3>0){
System.out.println("a为假币,比真币重:a = "+a);
}else if(test3==0){//第三次为 even
System.out.println("c为假币,比真币重:c = "+c);
}else
System.out.println("b为假币,比真币重:b = "+b);
}else if(test2 == 0){//第二次为 even
int test3 = (a+b+c+f) - (i+j+k+g);//第三次称重比较
if(test3>0){
System.out.println("g为假币,比真币轻:g = "+g);
}else if(test3==0){//第三次为 even
System.out.println("h为假币,比真币轻:h = "+h);
}else
System.out.println("f为假币,比真币轻:f = "+f);
}else{
int test3 = (a+b+c+d) - (i+j+k+l);//第三次称重比较
if(test3>0){
System.out.println("d为假币,比真币重:d = "+d);
}else
System.out.println("e为假币,比真币轻:e = "+e);
}
}else if( test1 == 0){//第一次为 even
if(test2 > 0){
int test3 = (a+b+c+i)-(e+f+g+j);//第三次称重比较
if(test3 > 0){
System.out.println("j为假币,比真币轻:j = " + j);
}else if(test3 == 0){//第三次为 even
System.out.println("k为假币,比真币轻:k = "+k);
}else
System.out.println("i为假币,比真币轻:i = "+i);
}else if(test2 == 0){//第二次为 even
int test3 = (a+b+c+d) - (i+j+k+l);//第三次称重比较
if(test3 > 0)
System.out.println("l为假币,比真币轻:l = "+l);
else
System.out.println("l为假币,比真币重:l = "+l);
}else{
int test3 = (a+b+c+i)-(e+f+g+j);//第三次称重比较
if(test3 > 0){
System.out.println("i为假币,比真币重:i = " + i);
}else if(test3 == 0){//第三次为 even
System.out.println("k为假币,比真币重:k = "+k);
}else
System.out.println("j为假币,比真币重:j = "+j);
}
} else{//第一次为 down
if(test2 < 0){
int test3 = (i+j+k+a) - (e+f+g+b);//第三次称重比较
if(test3<0){
System.out.println("a为假币,比真币轻:a = "+a);
}else if(test3==0){//第三次为 even
System.out.println("c为假币,比真币轻:c = "+c);
}else
System.out.println("b为假币,比真币轻:b = "+b);
}else if(test2 == 0){//第二次为 even
int test3 = (a+b+c+f) - (i+j+k+g);//第三次称重比较
if(test3<0){
System.out.println("g为假币,比真币重:g = "+g);
}else if(test3==0){//第三次为 even
System.out.println("h为假币,比真币重:h = "+h);
}else
System.out.println("f为假币,比真币重:f = "+f);
}else{
int test3 = (a+b+c+d) - (i+j+k+l);//第三次称重比较
if(test3<0){
System.out.println("d为假币,比真币轻:d = "+d);
}else
System.out.println("e为假币,比真币重:e = "+e);
}
}
}
}
复制代码
作者:
Super_Class
时间:
2013-6-3 18:58
package com.jie.act;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class TrueFalseCoin {
public static void main(String []args){
String []str1 = null;
String []str2 = null;
String []str3 = null;
System.out.println("输入的必须是标号为A-L,示例输入:"+"\r\n"+"abcd efgh even");
for (int i = 0; i < 3; i++) {
if (i==0) {
System.out.println("请输入第一次的结果:");
str1 = inmethod();
}else if (i==1) {
System.out.println("请输入第二次的结果:");
str2 = inmethod();
}else {
System.out.println("请输入第三次的结果:");
str3 = inmethod();
}
}
String strinfo = disCoins(str1,str2,str3);
System.out.println(strinfo);
}
public static String disCoins(String[] str1, String[] str2, String[] str3) {
if(str1.length !=3||str2.length !=3||str3.length !=3){
throw new RuntimeException("输入错误");
}
if (str1.length != str2.length) {
throw new RuntimeException("前两个硬币个数应该相等。输入错误");
}
// 设置一个记录假的银币
char retValch = 0 ;
String tf = null;
Set<Character> set = new HashSet<Character>();
// 先将even的所有元素添加到集合中
String []laststr = {str1[2],str2[2],str3[2]};
// 判断哪个是even的
for (int i = 0; i < laststr.length; i++) {
if(laststr[i].equalsIgnoreCase("even")){ //必须把所有even的元素都添加到集合中
// 如果是0元素就是str1的
if(i==0){
for (int j = 0; j < 2; j++) {
char []chs = str1[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
if (i==1) {
for (int j = 0; j < 2; j++) {
char []chs = str2[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
if(i==2){
for (int j = 0; j < 2; j++) {
char []chs = str3[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
set.add(chs[k]);
}
}
}
}
}
for (int i = 0; i < laststr.length; i++) {
if(!laststr[i].equalsIgnoreCase("even")){
if (i==0) {//第一次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str1[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
if (i==1) {//第二次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str2[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
if (i==2) {//第三次的硬币中有假币
for (int j = 0; j < 2; j++) {
char []chs = str3[j].toCharArray();
for (int k = 0; k < chs.length; k++) {
if(!set.contains(chs[k])){
retValch = chs[k];
tf = reqHT(laststr, i, j);
}
}
}
}
}
}
if (set.size()<10) {
throw new RuntimeException("无法获得结果");
}
return "假币是"+retValch+tf;
}
public static String reqHT(String[] laststr, int i, int j) {
String tf;
if(laststr[i].equalsIgnoreCase("up")){ //右边高
if(j==1)//并且假币在右边
tf = "假币轻";
else {
tf = "假币重";
}
}
else { //右边低
if (j==1) { //假币在右边
tf = "假币重";
}
else {
tf = "假币轻";
}
}
return tf;
}
public static String[] inmethod() {
String readline = input(System.in);
String []strs = null;
if(readline !=null){
//将输入的信息进行切割
strs= splitReadLne(readline);
}
return strs;
}
public static String[] splitReadLne(String readline) {
//设置一个变量记录空格出现的索引值
int index = 0;
//设置一个数组,因为长度不确定,将它设置为str的长度
String []arr_str = new String[readline.length()];
//arr_str的长度不确定,为了将不需要的null去掉,所以设置了arr_str2数组
String []arr_str2 =null;
//为了将数据存储到arr_str中,定义一个变量
int p = 0;
while(((index = readline.indexOf(" ")))!=-1){ //当索引值不是空的时候循环(字符串中有空格)
if(index == 0){
/*
* 如果得到的字串中第一个字符还是空格,就接着更新
空20空空29空8 index = 0,就从1开始取后边的所有的数。
得到20空空29空8 index = 3!=0.
将20取出来放到一个数组里去,并且将去除20后的字符串更新
*/
readline = readline.substring(1, readline.length());
}else{
arr_str[p++] = readline.substring(0,index);
readline = readline.substring(index+1, readline.length());
}
}
//到这里肯定还有一个数,直接添加到数组中去
arr_str[p] = readline;
int mark = 0; //得到了一个含有多个null的数组。
for (int i = 0; i < arr_str.length; i++) {
//将第一次出现null元素的位置记录,这个位置就是数组所需要的实际长度
//跳出循环。得到最小长度
if(arr_str[i] == null){
mark = i;
break;
}
}
arr_str2 = new String[mark]; //长度确定了,就可以直接new对象了
for(int i = 0;i<mark;i++){
arr_str2[i] = arr_str[i];
}
//String arr_str[] = str.split(" ");
return arr_str2;
}
/**
* 三次就可以得到结果
* 不知道假硬币比真硬币轻还是重
*/
public static String input (InputStream in){
//为了方便,将键盘输入的字节使用转换流进行转换
BufferedReader bufr = new BufferedReader(new InputStreamReader(in));
String line = null;
try {
line = bufr.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (line !=null) {
return line;
}
return null;
}
}
复制代码
作者:
peerless2012
时间:
2013-6-3 19:06
/*题目:
* 赛利有12枚银币,其中11枚真币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。
* 于是他向朋友借了一架天平。朋友希望赛利3次就能找出假币并且确定假币是轻还是重。
* 例如,如果赛利用天平称两枚硬币,发现天平平稀,说明两枚都是真的。
* 如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。
* 请经过精心安排每次的称量,希望赛利按照您的策略称3次后确定假币。
* 赛利事先将银币标号为A-L,其中平衡状态用“up”、“down”或“even”表示,分别为右端高、右端低和平衡。
* 天平左右的硬币数总是相等的。
输出哪一个标号的银币是假币,并说明它比真币轻还是重。
样例输入1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
样例输出
K为假币,比真币轻.
* 对题目分析可能有四种情况
* 1 三个都是平衡的
* 2 两个平衡,一个不平衡
* 3 一个平衡,两个不平衡
* 4 三个都不平衡
* */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class RealCoin {
public static char[] coin1=new char[9],coin2=new char[9],coin3=new char[9];//三个数组,用来存放三次称量的结果
public static int index= 0;//用来标志假金币的坐标
public static String result="",choice,string;//result是存放结果,choice是选择的类型,String输入的称量结果的字符串
public static BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));//创建输入流对象
public static void main(String[] args) throws IOException {
run();
}
private static void run() throws IOException {
System.out.println("天平左右元素以及结果用空格分开,");
System.out.println(" 其中:e代表平衡,d代表右侧下沉,u代表右侧向上");
System.out.println(" 格式举例:abcd efgh e abij efgh e abci efjk u");
System.out.println(" 平衡的放到前面,不平衡的放到后面");
System.out.println(" 选择项:1,三次都是平衡的。");
System.out.println(" 2,前两次平衡,第三次不平衡。");
System.out.println(" 3,第一次平衡,第二第三次都不平衡。");
System.out.println(" 4,三次全不平衡。");
System.out.println("请输入类型以及称量后的结果:");
string=bReader.readLine();//读取称量结果
if (string.length()==35) {//如果不符合要求,则进制输入类型选择,拒绝向下执行
choice=bReader.readLine();
}else {
System.out.println("输入的三次结果有误,请重新输入!");
}
String [] stringResult=string.split(" ");//获取输入的三种情况,数组含有九个个元素,每三个一组 ,分别表示左侧,右侧以及平衡情况
getInputArray(stringResult);
switch (choice.charAt(0)) {
case '1':
findFalseCoin1();
break;
case '2':
findFalseCoin2();
break;
case '3':
findFalseCoin3();
break;
case '4':
findFalseCoin4();
break;
default:
System.out.println("选择有误,请重新输入");
break;
}
bReader.close();//关闭输入流
}
private static void findFalseCoin1() { //三个全是真的abcd efgh e abci efgj e abcd efgk e
char[] reg="abcdefghijkl".toCharArray(); //三个全真,则未出现的如果是1个,则就是假的,如果多于一个则无法判断
for (int i = 0; i < 8; i++) { //把匹配字符串中在数组中出现过的元素排除掉
for (int j = 0; j < 12; j++) {
if (reg[j]==coin1[i]||reg[j]==coin2[i]||reg[j]==coin3[i]) {
reg[j]='n';
}
}
}
for (int i = 0; i < reg.length; i++) { //找到没有出现的字符
if (reg[i]!='n') {
result+=reg[i];
}
}
getResult();
}
private static void findFalseCoin2() {//第一第二个是平衡的,第三个不平衡 。abcd efgh e abij efgh e abci efjk u
for (int i = 0; i < 8; i++) { //第一二中的肯定是真的,用真的去检验第三个数组,没有检测到的就是假的
for (int j = 0; j < 8; j++) {
if (coin1[i]==coin3[j]||coin2[i]==coin3[j]) {
coin3[j]='n';
}
}
}
for (int i = 0; i < 8; i++) {
if (coin3[i]!='n') {
result+=coin3[i];
index=i;
}
}
getResult();
}
private static void findFalseCoin3( ) { //三个输入,第一个是真,第二三是不平衡的 k为假 abcd efgh e abik efhl u acgk ehbg u
for (int i = 0; i < 8; i++) { //用第一个数组跟其余两个比较,有相同的就把相同的设置为'n'。把由第一个确定的真的去掉
for (int j = 0; j < 8; j++) {
if (coin1[i]==coin2[j]) {
coin2[j]='n';
}
if (coin1[i]==coin3[j]) {
coin3[j]='n';
}
}
}
for (int i = 0; i < 8; i++) { //用第一个数组跟其余两个比较,有相同的就把相同的设置为'n'。
for (int j = 0; j < 8; j++) {
if (coin2[i]==coin3[j]&&coin2[i]!='n'&&coin3[i]!='n') {
result+=coin2[i];
index=j;//记住相同元素的位置
}
}
}
getResult();
}
private static void findFalseCoin4() {//三个都是不平衡的 k为假,kabc defg u kbcf hijl u kade ghij u
for (int i = 0; i < 8; i++) { //三个数组逐级比较,找到在三个数组中都出现的字符,就是假的。
for (int j = 0; j < 8; j++) {
for (int k = 0; k < 8; k++) {
if (coin1[i]==coin2[j]&&coin2[j]==coin3[k]) {
result+=coin3[k];
index=k; //记录标志位
}
}
}
}
getResult();
}
private static void getInputArray(String [] s) {//给数组赋值,前8个元素表示八个金币,后一个表示状态
for (int i = 0; i < 9;i=i+3) {
if (0==i) {
coin1=(s[i]+s[i+1]+s[i+2]).toCharArray();
System.out.println((s[i]+s[i+1]+s[i+2]).toString());
}
else if (3==i) {
coin2=(s[i]+s[i+1]+s[i+2]).toCharArray();
System.out.println((s[i]+s[i+1]+s[i+2]).toString());
}
else if (6==i) {
coin3=(s[i]+s[i+1]+s[i+2]).toCharArray();
System.out.println((s[i]+s[i+1]+s[i+2]).toString());
}
}
}
private static void getResult() { //判断哪个是假的金币,如果得到假的金币,判断其是偏轻还是偏重
if (result.length()==1) {
System.out.println("假的金币是:"+result);
if (index>=4) { //判断偏轻偏重
if (coin3[8]=='u') {
System.out.println("假金币偏轻");
}else {
System.out.println("假金币偏重");
}
}
else {
if (coin3[8]=='u') {
System.out.println("假金币偏重");
}else {
System.out.println("假金币偏轻");
}
}
}else if (result.length()>1) {
System.out.println("无法由输入获取哪个金币是假的");
}else {
System.out.println("系统出错");
}
}
}
复制代码
作者:
叶征东
时间:
2013-6-3 22:11
qwqwqqeqw
作者:
李征
时间:
2013-6-4 03:41
晚上刚看见有这个活动!居然已经超过时间了,不过还是做出来了,唉,不知道有没有分,十分想进黑马!{:soso_e130:}
import java.io.*;
class SuanFa
{
public static void main(String[] args) throws IOException
{
suan();//调用suan()方法;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
static void suan() throws IOException
{
int A=1,B=1,C=1,D=1,E=1,F=1,G=1,H=1,I=1,J=1,K=1,L=1;//为每个字母赋初值,模拟真币等于1.
System.out.println("请输入假币的重量,0为轻,2为重:");
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));//从键盘获取用户定义的重量
String line = buf.readLine();
int n = Integer.valueOf(line).intValue();
System.out.println("请输入A-L中任意一个数作为假币:");
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//从键盘获取用户定义的假币字母
char zimu =(char)bufr.read();
switch(zimu)//判断输入的字母是否符合要求,并为该字母重新赋值,从而和真币区别开
{
case 'A':
A=n;
break;
case 'B':
B=n;
break;
case 'C':
C=n;
break;
case 'D':
D=n;
break;
case 'E':
E=n;
break;
case 'F':
F=n;
break;
case 'G':
G=n;
break;
case 'H':
H=n;
break;
case 'I':
I=n;
break;
case 'J':
J=n;
break;
case 'K':
K=n;
break;
case 'L':
L=n;
break;
default:
System.out.println("字母输入错误!");
bufr.close();
}
if(n==2|n==0)//判断是否获取到正确的重量值
{
if((A+B+C+D)==(E+F+G+H))//判断前后4个字母之和是否相同,如相同,代表都是真币
{
sop("ABCD EFGH even");
if((A+B+C)==(I+G+K))//前8个字母都相同,那么假币肯定在IGKL中,用3个真币比较IGKL中任意3个银币,如果even
{
sop("ABC IGK even");
if(A>L)//如果ABCIGK都相同,代表L是假币,用真币A比较L,得出轻重
{
sop("A L up");
sop("L为假币,比真币轻。");
}
else if (A<L)
{
sop("A L down");
sop("L为假币,比真币重。");
}
}
else if((A+B+C)>(I+G+K))//前8个币都相同,那么假币肯定在IGKL中,用3个真币比较IGKL中任意3个币,如果up,已经确定假币是轻的
{
sop("ABC IGK up");
if(I==G)//判断币I与币G是否even,如even,表示此3枚币中唯一剩下的K为假币,轻
{
sop("I G even");
sop("K为假币,比真币轻。");
}
else if (I>G)//判断币I与币G是否up,如up,表示此3枚币中唯一剩下的G为假币,轻
{
sop("I G up");
sop("G为假币,比真币轻。");
}
else if (I<G)//判断币I与币G是否down,如down,表示此3枚币中唯一剩下的I为假币,轻
{
sop("I G down");
sop("I为假币,比真币轻。");
}
}
else if ((A+B+C)<(I+G+K))//前8个币都相同,那么假币肯定在IGKL中,用3个真币比较IGKL中任意3个币,如果down,已经确定假币是重的
{
sop("ABC IGK down");
if(I==G)//判断币I与币G是否even,如even,表示此3枚币中唯一剩下的K为假币,重
{
sop("I G even");
sop("K为假币,比真币重。");
}
else if (I>G)//判断币I与币G是否down,如down,表示此3枚币中唯一剩下的G为假币,重
{
sop("I G down");
sop("G为假币,比真币重。");
}
else if (I<G)//判断币I与币G是否up,如up,表示此3枚币中唯一剩下的I为假币,重
{
sop("I G up");
sop("I为假币,比真币重。");
}
}
}
else if((A+B+C+D)>(E+F+G+H))//判断前后4个字母之和是否相同,如up,代表其中有一方带有假币,目前轻重不明
{
sop("ABCD EFGH up");
if((A+B+E)==(C+F+I))//左边,右边分别任意取出2个币,1个换到左边,右边加一枚真币(IGKL为真币),如even,则假币在DGH中
{
sop("AFCG BEDI EVEN");
if (D==G)//如果D与G为even,则H为假币,H原来在右边的时候为UP,所以轻
{
sop("D G even");
sop("H为假币,比真币轻。");
}
else if (D==H)//如果D与H为even,则G为假币,G原来在右边的时候为UP,所以轻
{
sop("D H even");
sop("G为假币,比真币轻。");
}
else if (H==G)//如果H与G为even,则D为假币,D原来在左边的时候为UP,所以重
{
sop("H G even");
sop("D为假币,比真币重。");
}
}
else if ((A+B+E)>(C+F+I))//如果依旧UP,那么可以肯定假币在2次比较位置都没有改变的ABF里
{
sop("ABE CFI up");
if (A==B)//如even,则F为假币,因为原来在右边,所以轻
{
sop("A B even");
sop("F为假币,比真币轻。");
}
else if (A==F)//如even,则B为假币,因为原来在左边,所以重
{
sop("A F even");
sop("B为假币,比真币重。");
}
else if (B==F)//如even,则A为假币,因为原来在左边,所以重
{
sop("B F even");
sop("A为假币,比真币重。");
}
}
else if ((A+B+E)<(C+F+I))//如果down,那么可以肯定假币在2次比较位置改变的EC里,I是真币
{
sop("ABE CFI down");
if ((E+C)<(A+B))//如果down,证明没变位置的E为假币,且轻
{
sop("EC AB down");
sop("E为假币,比真币轻。");
}
else if ((E+C)>(A+B))//如果up,证明改变位置的C为假币,且重
{
sop("EC AB up");
sop("C为假币,比真币重。");
}
}
}
else if((A+B+C+D)<(E+F+G+H))
{
sop("ABCD EFGH down");
if((A+B+E)==(C+F+I))//左边,右边分别任意取出2个币,1个换到左边,右边加一枚真币(IGKL为真币),如even,则假币在DGH中
{
sop("AFCG BEDI EVEN");
if (D==G)//如果D与G为even,则H为假币,H原来在右边的时候为down,所以重
{
sop("D G even");
sop("H为假币,比真币重。");
}
else if (D==H)//如果D与H为even,则G为假币,G原来在右边的时候为down,所以重
{
sop("D H even");
sop("G为假币,比真币重。");
}
else if (H==G)//如果H与G为even,则D为假币,D原来在左边的时候为down,所以轻
{
sop("H G even");
sop("D为假币,比真币轻。");
}
}
else if ((A+B+E)<(C+F+I))//如果down,那么可以肯定假币在2次比较位置都没有改变的ABF里
{
sop("ABE CFI up");
if (A==B)//如even,则F为假币,因为原来在右边,所以重
{
sop("A B even");
sop("F为假币,比真币重。");
}
else if (A==F)//如even,则B为假币,因为原来在左边,所以轻
{
sop("A F even");
sop("B为假币,比真币轻。");
}
else if (B==F)//如even,则A为假币,因为原来在左边,所以轻
{
sop("B F even");
sop("A为假币,比真币轻。");
}
}
else if ((A+B+E)>(C+F+I))//如果up,那么可以肯定假币在2次比较位置改变的EC里,I是真币
{
sop("ABE CFI up");
if ((E+C)>(A+B))//如果up,证明没变位置的E为假币,且重
{
sop("EC AB up");
sop("E为假币,比真币重。");
}
else if ((E+C)<(A+B))//如果down,证明改变位置的C为假币,且轻
{
sop("EC AB down");
sop("C为假币,比真币轻。");
}
}
}
}
else
System.out.println("重量输入错误!");//判断重量是否输入错误
buf.close();
}
}
作者:
小羽天空
时间:
2013-6-4 12:14
就到期了?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2