二柱子四则运算算法
要求随机生成指定数量的四则运算题目,同时可以控制操作数的个数、控制操作数的生成范围、控制是否生成乘除法、控制是否加入括号。
源代码如下:
package pers.yan.classTest; import java.util.Random; import java.util.Scanner; public class ClassTest { public static void main(String[] args) { ClassTest A = new ClassTest(); Scanner sc = new Scanner(System.in); System.out.println("请输入生成四则运算题目的个数:"); int iControl = sc.nextInt(); //iControl用于控制生成题目总数 System.out.println("请输入操作数的个数:"); int iControl2 = sc.nextInt(); //iControl2用于控制生成操作数的个数 System.out.println("请输入操作数的生成范围:"); int iField = sc.nextInt(); //iField用于控制操作数的生成范围 System.out.println("请输入是否有乘除法(有:1;没有:0)"); int iWay = sc.nextInt(); //iWay用于控制是否有乘除法 System.out.println("请输入是否添加括号(添加:1;不添加:0)"); int iChoose = sc.nextInt(); //iChoose用于判断是否添加括号 if(iControl < 1 || iControl2 < 2 || iField < 0 || (iWay != 1 && iWay != 0) || (iChoose != 1 && iChoose != 0)) { System.out.println("输入错误,请重新输入!"); return; } else { A.jisuan(iControl,iWay,iControl2,iField,iChoose); } } public void jisuan(int iControl,int iWay,int iControl2,int iField,int iChoose) { Random random = new Random(); int[] str = new int[iControl+10000]; int[] arrNum = new int[iControl2*2-1]; int Flag = 0; for(int j = 0;j < iControl - Flag;j++) { boolean test = true; //int iNumc = random.nextInt(iControl2 - 1); //控制前括号输出 //int iNumd = random.nextInt(iControl2 - iNumc - 1) + iNumc + 1; //控制后括号输出 int iNumc = random.nextInt(iControl2 - 1); int iNumd = random.nextInt(iControl2 - iNumc) + iNumc + 1; for(int i = 0;i < iControl2*2-1 ;i++) { arrNum[i] = random.nextInt(iField); } for(int t = 0; t < iControl2;t++) { str[j] += arrNum[t*2]*t; } for(int k = 0; k < j ;k++) { if(str[k] == str[j]) { iControl++; Flag++; test = false; break; } } if(test) { for(int t = 0;t < iControl2 * 2 - 1 ;t++) { if(iChoose == 1) { if( 2*iNumc == t) System.out.print("("); if(t%2 == 0 && t!= iControl2*2-2) { System.out.print(arrNum[t] + " "); if( 2*iNumd - 2 == t) //2*iNumd - 1 == t System.out.print(")"); } else if(t == iControl2*2-2) { System.out.print(arrNum[t]); if( 2*iNumd - 2 == t) System.out.print(")"); System.out.println(" ="); } else if(t % 2 == 1) { if(iWay == 1) { if(arrNum[t]%4 == 1) { System.out.print("+ "); } else if(arrNum[t]%4 == 2) { System.out.print("- "); } else if(arrNum[t]%4 == 3) { System.out.print("* "); } else if(arrNum[t]%4 == 0) { System.out.print("/ "); } } else if(iWay == 0) { if(arrNum[t]%2 == 1) { System.out.print("+ "); } else if(arrNum[t]%2 == 0) { System.out.print("- "); } } } } else { if(t%2 == 0 && t!= iControl2*2-2) { System.out.print(arrNum[t] + " "); } else if(t == iControl2*2-2) { System.out.println(arrNum[t] + " ="); if( 2*iNumd - 1 == t) System.out.print(")"); } else if(t % 2 == 1) { if(iWay == 1) { if(arrNum[t]%4 == 1) { System.out.print("+ "); } else if(arrNum[t]%4 == 2) { System.out.print("- "); } else if(arrNum[t]%4 == 3) { System.out.print("* "); } else if(arrNum[t]%4 == 0) { System.out.print("/ "); } } else if(iWay == 0) { if(arrNum[t]%2 == 1) { System.out.print("+ "); } else if(arrNum[t]%2 == 0) { System.out.print("- "); } } } } } } } } }
目前存在的问题:
(1)代码可读性和复用性较差,当时写的时候一层层地写,就一层层地向里嵌套for循环,导致函数整体是在一个for循环内完成。虽然逻辑清晰,但是导致代码的可读性和复用性很差,在后续的代码编写过程中还要注意优化这方面的问题;
(2)关于是否输出括号那方面的问题,依然是有些不太明白,在同学的帮助下误打误撞地成功实现了输出,但是仍然没有完全理解,后续仍然需要深化加强。