package my_mian_shi; import java.util.Random; /** * * @author 程序员与数学家 * 面试题说明: * 给予6个各个数字都不相同的4位数,每个4位数对应还有一个二位数ab,需要你猜一个四位数x(不能保证解唯一) * a 表示x与ab对应的那个4位数 对应位置的数字相等的个数 。如:1234 与1432 对应位置相同的个数为2 * b 表示x与ab对应的那个4位数 对应位置不同数字相等的个数 。如:1234 与1432 对应位置不相同的个数为2 */ public class GameMain { Random r=new Random(); int answer; int []question; int []prompt; public static void main(String []args) { GameMain gm=new GameMain(); gm.run(); } /* * 展示规范格式化数 * a:待规范的整数 * b:规范整数的位数 */ public void selectShow(int a,int b) { if(a==0) { for(int i=0;i<=b;i++) System.out.print("0"); }else if(a<Math.pow(10, b) && a>=Math.pow(10, b-1)) System.out.print("0"+a); else System.out.print(a); } /* * 启动函数 */ public void run() { init(); System.out.print("答案:"); this.selectShow(answer,3); System.out.println(); System.out.println("问题:"); for(int i=0;i<6;i++) { this.selectShow(question[i],3); System.out.print(" "); this.selectShow(this.prompt[i], 1); System.out.println(); } } /* * 初始化 */ public void init() { answer=getFourFigures(); question=new int[6]; prompt=new int[6]; int b; for(int i=0;i<question.length;i++) { b=getFourFigures(); if(intIsExist(question, b,0,i)<0) question[i]=b; } //构造第一个提示 for(int i=0;i<prompt.length;i++) { if(this.answer<1000) { if(question[i]<1000) prompt[i]=getEqualPositionAndValueCount(answer, question[i])+1; else prompt[i]=getEqualPositionAndValueCount(answer, question[i]); }else { prompt[i]=getEqualPositionAndValueCount(answer, question[i]); } } //构造第二个提示 for(int i=0;i<prompt.length;i++) { if((this.answer<1000 && this.intExist0(question[i])) || (question[i]<1000 && this.intExist0(this.answer))) this.prompt[i]=this.prompt[i]*10+this.getNotEqualPositionAndEqualValueCount(answer, question[i])+1; else this.prompt[i]=this.prompt[i]*10+this.getNotEqualPositionAndEqualValueCount(answer, question[i]); } } /* * 获取一个数是否含有0这个数字 */ public boolean intExist0(int a) { while(a!=0) { if(a%10==0) return true; a=a/10; } return false; } /* * 获取两整数不同位置相同值的个数(不够位前面会补0) */ public int getNotEqualPositionAndEqualValueCount(int a,int b) { int count=0; int temp,ba=0,bb=0; while(a!=0) { temp=b; while(temp!=0) { if((a%10==temp%10) && (ba!=bb)) count++; temp=temp/10; bb++; } bb=0; a=a/10; ba++; } return count; } /* * 判断两个整数对应的位置相同且值相同的数字的个数 */ public int getEqualPositionAndValueCount(int a,int b) { int count=0; int max = a>b?a:b; while(max!=0) { if(a%10==b%10) count++; max=max/10; a=a/10; b=b/10; } return count; } /* * 判断一个整型数组是否存在另外一个整数 * a:整型数组 * b:待比较的整数 * start:开下标 * end:结束下标 */ public int intIsExist(int []a,int b,int start,int end) { for(int i=start;i<end;i++) { if(a[i]==b) return i; } return -1; } /* * 生成1个各位互不相同的4位数 (返回的是三位数代表第一位是0) */ public int getFourFigures () { int a,b; int []temp=new int[3]; a=r.nextInt(10); int i; for (i=0;i<3;i++) { temp[i]=r.nextInt(9); b=decideIsExist(a, temp[i]); if(b<0 || (temp[i]==0 && b==i+1)) { a=a*10+temp[i]; }else{ i--; } } return a; } /* * 判断一个n位数是否存在某个0到9的数 * 返回值:对应的位置数 * a:n位数(认为第n+1位是0) * b:某个0到9的数 */ public int decideIsExist(int a,int b) { if(b<0 || b>9) { throw new RuntimeException("不是用0到9的数进行比较"); } int i=0; while(a!=0) { if((a%10)==b) return i; a=a/10; i++; } if(a==b) return i; return -1; } }
如图:
01 表示 答案和6120 有一个数字值相同 位置不同
30 表示 答案和0513 有三个数字值相同 位置不同