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 有三个数字值相同 位置不同