题目: 某学校需要一个能给学领前儿童自动出三个数加减法的算术题的程序,要求在运算过程中只能使用20以内的加减法且不能出现负数,并且未知数可以在等式的任何一位, 如 3 + 4 – 2 = ( ), 8 – ( ) + 6 = 12等。 并且计算过程中也不能出现负数 或大于20
/**
* 我的实现思路 开始用的把所有可能都枚举了出来 嵌套循环 --后来改成了如下思路
* 构造等式: a*b*c=() || a*b*()=c || a*()*b=c ||()*a*b=c 随机空也就在3 2 1 0
* 1.得到3个随机数 1个随机空位置 2个符号
* 2.判断随机索引位位置
* 此处分为2种情况
* i.随机位置为0|1 则不需要进行判断 前两位的计算在0-20之间
* ii. 随机位置为2|3 则需要进行前两位计算判断是否在0-20之间 不在则踢出重试
* 3.判断随机符号,第一位符号 与第二位符号都会出现两种情况即+|- 所以每种情况都要判断
* eg: a+b-c=() 第一位为+,二位- 并且随机索引在3位置 则需要进行2次判断
* i.判断 a+b 是否在0-20 若符合进行第二次符号位判断
* ii. 判断a+b-c是否在0-20 若符合 则就是我所需要的 其他情况也是这样判断
*/
static String [] symbols={"+","-"};
public static void main(String[] args) {
int t=0;
while (t<50){
String test = getQuestion();
if (test==null){
continue;
}
System.out.println(test);
t++;
}
}
public static String getQuestion(){
int a = getRandom(21);
int b = getRandom(21);
int c = getRandom(21);
//随机空位置
int randomIndex = getRandom(4);
//随机符号
int firstSymbol = getRandom(2);
int secondSymbol = getRandom(2);
String result=null;//结果
if (randomIndex==3){
//1*1*1=() 代表加
if (firstSymbol==0&&a+b>=0&&a+b<=20){
if (secondSymbol==0&&a+b+c>=0&&a+b+c<=20){
//+
result=a+"+"+b+"+"+c+"="+"()";
}else if (secondSymbol==1&&a+b-c>=0&&a+b-c<=20){
//-
result=a+"+"+b+"-"+c+"="+"()";
}
return result;
} else if (firstSymbol==1&&a-b>=0&&a-b<=20){
//第一个符号为减
if (secondSymbol==0&&a-b+c>=0&&a-b+c<=20){
//+
result=a+"-"+b+"+"+c+"="+"()";
}else if (secondSymbol==1&&a-b-c>=0&&a-b-c<=20){
//-
result=a+"-"+b+"-"+c+"="+"()";
}
return result;
}
}
else if (randomIndex==2){
//a*b*()=c
if (firstSymbol==0&&a+b>=0&&a+b<=20){
//+
if (secondSymbol==0&&c-a-b>=0&&c-a-b<=20){
//a+b+()=c
result=a+"+"+b+"+"+"()"+"="+c;
}
else if (secondSymbol==1&&a+b-c>=0&&a+b-c<=20){
//a+b-()=c
result=a+"+"+b+"-"+"()"+"="+c;
}
return result;
} else if (firstSymbol==1&&a-b>=0&&a-b<=20){
//-
if (secondSymbol==0&&c-a+b>=0&&c-a+b<=20){
//a-b+()=c
result=a+"-"+b+"+"+"()"+"="+c;
} else if (secondSymbol==1&&a-b-c>=0&&a-b-c<=20){
//a-b-()=c
result=a+"-"+b+"-"+"()"+"="+c;
}
return result;
}
}else if (randomIndex==1){
//a*()*b=c
if (firstSymbol==0){
//不存在22运算
if (secondSymbol==0&&c-a-b>=0&&c-a-b<=20){
//a+()+b=c
result=a+"+"+"()"+"+"+b+"="+c;
}else if (secondSymbol==1&&c+b-a>=0&&c+b-a<=20){
//a+()-b=c
result=a+"+"+"()"+"-"+b+"="+c;
}
return result;
}else if (firstSymbol==1){
//a*()*b=c
if (secondSymbol==0&&a+b-c>=0&&a+b-c<=20){
//a-()+b=c
result=a+"-"+"()"+"+"+b+"="+c;
}else if (secondSymbol==1&&a-b-c>=0&&a-b-c<=20){
//a-()-b=c
result=a+"-"+"()"+"-"+b+"="+c;
}
return result;
}
}else if (randomIndex==0){
//()*a*b=c
if (firstSymbol==0){
//不需要判断
if (secondSymbol==0&&c-a-b>=0&&c-a-b<=20){
//()+a+b=c
result="()"+"+"+a+"+"+b+"="+c;
}else if (secondSymbol==1&&c+b-a>=0&&c+b-a<=20){
//()+a-b=c
result="()"+"+"+a+"-"+b+"="+c;
}
return result;
}else if (firstSymbol==1){
//()-a
if (secondSymbol==0&&c-b+a>=0&&c-b+a<=20){
//()-a+b=c
result="()"+"-"+a+"+"+b+"="+c;
}else if (secondSymbol==1&&c+b+a>=0&&c+b+a<=20){
//()-a-b=c
result="()"+"-"+a+"-"+b+"="+c;
}
return result;
}
}
return result;
}
//得到随机数
private static int getRandom(Integer max){
Random random = new Random();
int result = random.nextInt(max);
return result;
}
如果有问题,还请大佬告诉小弟。或者给小弟提个更好的思路。这也太太太。。不优雅了 啊哈哈哈