四则运算的代码,后面几天在反复测试优化
package formula;
import java.util.*;
public class RandomFormula {
public int numberTotal;//运算操作数
public int formulaTotal;//运算式数量
public int numberRange;//数值范围
public boolean includeMulAndDiv;//是否包含乘除
public boolean includeNegNum;//是否包含负数
public RandomFormula() {
this.numberTotal = 2;
this.formulaTotal = 30;
this.numberRange = 100;
this.includeMulAndDiv = false;
this.includeNegNum = false;
}
public RandomFormula(int numberTotal, int formulaTotal, int numberRange, boolean includeMulAndDiv,
boolean includeNegNum) {
this.numberTotal = numberTotal;
this.formulaTotal = formulaTotal;
this.numberRange = numberRange;
this.includeMulAndDiv = includeMulAndDiv;
this.includeNegNum = includeNegNum;
}
// 获取随机数
public int getRandomNumber() {
Random rand = new Random();
if (this.includeNegNum) {
return (rand.nextInt(this.numberRange) + 1) * (rand.nextDouble() > 0.5 ? 1 : -1);
} else {
return rand.nextInt(this.numberRange) + 1;
}
}
//得到一个随机的运算符
public String getRandomOperator() {
Random rand = new Random();
String[] operations = { "+", "-", "*", "/" };
return operations[rand.nextInt((this.includeMulAndDiv == true) ? 4 : 2)];
}
// 生成算式
public String generateFormula() {
String formula = "";
for (int i = 0; i < this.numberTotal; i++) {
if (i >= this.numberTotal - 1) {
formula += isNegNum(this.getRandomNumber());
continue;
}
formula += isNegNum(this.getRandomNumber()) + " " + this.getRandomOperator() + " ";
}
return formula;
}
//生成算式集合
public List getFormulas() {
List set = new ArrayList();
set.add(this.generateFormula());
while (set.size() <= this.formulaTotal){
for(int i=0;i
{
String formula=this.generateFormula();
if(!formula.equalsIgnoreCase(set.get(i)))
{
set.add(formula);
break;
}
}
}
return set;
}
//若负数,加括号
public String isNegNum(int num) {
if (num < 0) {
return "(" + num + ")";
}
return "" + num;
}
//生成算式结果???????all???
public int getAnswer(String formula) {
int length = 0;
String[] formulaArr = formula.split(" ");
String operators = "+-*/";
Stack opNumbers = new Stack();
Stack opOperators = new Stack();
opOperators.add("#");//字符栈中存储个#号,防止栈空???
while (length < formulaArr.length) {
String op = formulaArr[length++];
if (operators.indexOf(op) > -1) {// 若是运算符,判断优先级
String sign = opOperators.peek();
int priority = compare(op, sign);// 要入栈的跟栈顶的相比
if (priority >= 0) {// 如果要入栈的运算符高或者相等,出栈两个数字,和之前的运算符,计算后,将数字入栈,将字符入栈
opNumbers.add(compute(opOperators, opNumbers));
opOperators.add(op);
} else {// 入栈运算符优先级低,直接入栈??
opOperators.add(op);
}
continue;
}
// 若是数字,则入栈???
opNumbers.add(Integer.parseInt(op.replace("(", "").replace(")", "")));
}
while (opOperators.peek() != "#") {
opNumbers.add(compute(opOperators, opNumbers));
}
return opNumbers.pop();
}
//比较运算优先级
public int compare(String operator1, String operator2) {
int res = 0;
switch (operator1) {
case "+":
case "-":
if (operator2.equals("+") || operator2.equals("-") || operator2.equals("*") || operator2.equals("/")) {
res = 1;
} else {
res = -1;
}
break;
case "*":
case "/":
if (operator2.equals("*") || operator2.equals("/")) {
res = 1;
} else {
res = -1;
}
break;
}
return res;
}
//算式求值
public int compute(Stack opOperators, Stack opNumbers) {
int num2 = opNumbers.pop();
int num1 = opNumbers.pop();
String _op = opOperators.pop();
int result = 0;
switch (_op) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
}
return result;
}
//生成算式结果数组
public int[] getAnswers(List set) {
int[] arr = new int[set.size()];
int i = 0;
for (String str : set) {
arr[i++] = getAnswer(str);
}
return arr;
}
public List getAnswer0sList(List set) {
List arr = new ArrayList();
for (String str : set) {
arr.add( getAnswer(str));
}
return arr;
}
}
package formula;
import java.util.*;
class Thread1 extends Thread{
public boolean tim=true;
private String name;
public Thread1(String name) {
this.name=name;
}
public void run() {
for (int i = 0; i < 5; i++) {
//System.out.println(name + "倒计时 : " + (499-i));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("超时");
tim=false;
System.exit(0);
Thread.activeCount();
}
}
public class formula {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Thread1 mTh1=new Thread1("A");
int numtotal;//运算操作数
int formtotal;//运算式数量
int numrange;//数值范围
boolean muland=false;//是否包含乘除
boolean negnum=false;//是否包含负数
int time=5;//one fromula using time
Scanner in=new Scanner(System.in);
System.out.println("请输入 运算操作数 运算式数量 数值范围 /*是否包含乘除 是否包含负数*/
numtotal=in.nextInt();
formtotal=in.nextInt();
numrange=in.nextInt();
muland=in.nextBoolean();
negnum=in.nextBoolean();
System.out.println("请输入 one fromula use time:");
time=in.nextInt();
RandomFormula B=new RandomFormula (numtotal,formtotal,numrange, muland,negnum);
List test = new ArrayList();
test=B.getFormulas();
double correctrat=0;
List anwser = B.getAnswer0sList(test);
do {
int all=test.size();
correctrat=0;
if(all==0)
break;
System.out.println(test.size());//test use
for(int i=0;i
System.out.println(i+1+". "+test.get(i)+"=");//test use
System.out.println("=");//test use
for(int i=0;i
{
//mTh1.run();
mTh1.start();
System.out.print(i+1+". "+test.get(i)+"= ");
System.out.print(" 答案:");
if(anwser.get(i)==in.nextInt())
{
mTh1.interrupt();
System.out.println(" 答案 is:(tset use)"+anwser.get(i));
correctrat++;
test.remove(i);
anwser.remove(i);
}
}
System.out.println(correctrat/all);
System.out.println("全对了吗,有没有超时,没通过继续吧");
}while((correctrat/=test.size())!=1);
System.out.println("好吧,你过了。");
}
}