首先是大概的思路:
1.生成一个2到4的随机数,来确定计算式中的数字个数
2.确定好计算数的随机数
3.随机产生计算符号
4.组合 生成一个算数式 显示
5.计算结果
1.生成一个2到4的随机数,来确定计算式中的数字个数
Random random = new Random();
int a = random.nextInt(3)+2;
2.确定好计算数的随机数
由于多次生成随机数,此处生成一个方法:
public int getInt(int i){
int num = random.nextInt(i);
return num;
}
生成随机数:
num1 = getInt(100)+1;
num2 = getInt(100)+1;
num3 = getInt(100)+1;
num4 = getInt(100)+1;
3.随机产生计算符号
public char getSy(){
int a = getInt(4);
switch (a){
case 0:
return '+';
case 1:
return '-';
case 2:
return '×';
case 3:
return '÷';
}
return ' ';
}
4.组合 生成一个算数式 显示
public void show(){
StringBuilder builder = new StringBuilder();
int a = random.nextInt(3)+2;
int num1,num2,num3,num4;
char sy1,sy2,sy3;
switch (a){
case 2:
num1 = getInt(100)+1;
num2 = getInt(100)+1;
sy1 = getSy();
builder.append(num1).append(sy1).append(num2);
s = builder.toString();
break;
case 3:
num1 = getInt(100)+1;
num2 = getInt(100)+1;
num3 = getInt(100)+1;
sy1 = getSy();
sy2 = getSy();
builder.append(num1).append(sy1).append(num2).append(sy2).append(num3);
s = builder.toString();
break;
case 4:
num1 = getInt(100)+1;
num2 = getInt(100)+1;
num3 = getInt(100)+1;
num4 = getInt(100)+1;
sy1 = getSy();
sy2 = getSy();
sy3 = getSy();
builder.append(num1).append(sy1).append(num2).append(sy2).append(num3).append(sy3).append(num4);
s = builder.toString();
break;
}
textView_show.setText(s + "=?");
}
5.计算结果
计算逻辑:将得到的算术式进行分解,利用对算术式按计算符号分解的先后顺序,实现乘除的计算优先级。通过递归的方式实现。
public float cal(String s1){
int a1 = s1.indexOf('+');
int a2 = s1.indexOf('-');
int a3 = s1.indexOf('×');
int a4 = s1.indexOf('÷');
if(a1 != -1){
return cal(s1.substring(0,a1)) + cal(s1.substring(a1+1,s1.length()));
}
if(a2 != -1){
if(t > 0){
return cal(s1.substring(0,a2)) + cal(s1.substring(a2+1,s1.length()));
}
return cal(s1.substring(0,a2)) - cal(s1.substring(a2+1,s1.length()));
t++;
}
if(a3 != -1){
return cal(s1.substring(0,a3)) * cal(s1.substring(a3+1,s1.length()));
}
if(a4 != -1){
return cal(s1.substring(0,a4)) / cal(s.substring(a4+1,s1.length()));
}
return Float.parseFloat(s1);
}
限制结果为小数点后两位:
public void answer(View view){
float result = cal(s);
BigDecimal b = new BigDecimal(result);
float f1 = b.setScale(2,BigDecimal.ROUND_HALF_UP).floatValue();
textView_answer.setText(s+"="+f1);
}