某公司面试题的题目生成器。如果有实力大家可以进一步编程求解出答案

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

 

posted @ 2018-10-30 20:04  数学与IT  阅读(227)  评论(0编辑  收藏  举报