题目:支持整数和真分数的四则运算(需验证程序的正确性),题目避免重复,可定制出题数量。
思路:由于有真分数,所以我想到的是用int型的二维数组来存储数字(int a[num][2]),用char类型的一维数组来存储运算符,如果是整数则该行的第一个数存则为该数,第二个数存为零,如果是分数则该行的第一个数存分子,第二个数存分母,而且在生成分数的随机数时不包含0,利用1到4的随机数来随机生成运算符,在生成完所有的数后再查找是否有重复,如果有,则在该位置重新生成随机数。在计算之前先进行数字的处理,如果进行计算的两个数之中有分数,则将两个数的分母变为相同。最后约分。
package 出题; import java.util.Random; import java.util.Scanner; public class test { static int[][] a; static int[][] b; static int[][] r; static char[] c; static int max; public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("请输入题目的数量"); Scanner sc = new Scanner(System.in); int num = sc.nextInt(); System.out.println("请输入出现的最大整数"); max = sc.nextInt(); r = new int[num][num]; symbol(num); setnumber(num); yuefen(num); show(num); zhuanhuan(num); count(num); yuefenr(num); System.out.println("是否输出答案 1、是 2、否"); int n = sc.nextInt(); if(n==1) { showanswer(num); } else { System.out.println("结束"); } } public static void yuefen(int num) { for(int i=0;i<num;i++) { if(a[i][1]!=0&&a[i][0]!=0) { int n = (a[i][0]<a[i][1])?a[i][0]:a[i][1]; for(int j=2;j<=n;j++) { if(a[i][0]%j==0&&a[i][1]%j==0) { a[i][0] = a[i][0]/j; a[i][1] = a[i][1]/j; } } } } for(int i=0;i<num;i++) { if(b[i][1]!=0&&b[i][0]!=0) { int n = (b[i][0]<b[i][1])?b[i][0]:b[i][1]; for(int j=2;j<=n;j++) { if(b[i][0]%j==0&&b[i][1]%j==0) { b[i][0] = b[i][0]/j; b[i][1] = b[i][1]/j; } } } } } public static void yuefenr(int num) { for(int i=0;i<num;i++) { if(r[i][1]!=0&&r[i][0]!=0) { int n = (r[i][0]<r[i][1])?r[i][0]:r[i][1]; for(int j=2;j<=n;j++) { if(r[i][0]%j==0&&r[i][1]%j==0) { r[i][0] = r[i][0]/j; r[i][1] = r[i][1]/j; } } } } } public static void showanswer(int num) { for(int i=0;i<num;i++) { if(r[i][1]==0||r[i][1]==1) { System.out.println(i+1+"、"+r[i][0]); } else { if(Math.abs(r[i][1])>Math.abs(r[i][0])) { if(r[i][0]==0) { System.out.println(i+1+"、"+0); } else { System.out.println(i+1+"、"+r[i][0]+"/"+r[i][1]); } } else if(Math.abs(r[i][0])==Math.abs(r[i][1])) { System.out.println(i+1+"、"+1); } else { int m = r[i][0]%r[i][1]; System.out.println(i+1+"、"+r[i][0]/r[i][1]+"又"+m+"/"+r[i][1]); } } } } public static void zhuanhuan(int num) { for(int i=0;i<num;i++) { if(a[i][1]==0&&b[i][1]!=0) { a[i][0] = a[i][0]*b[i][1]; a[i][1] = b[i][1]; } else if(a[i][1]!=0&&b[i][1]==0) { b[i][0] = a[i][1]*b[i][0]; b[i][1] = a[i][1]; } else if(a[i][1]!=0&&b[i][1]!=0) { int t = a[i][1]*b[i][1]; a[i][0] = a[i][0]*b[i][1]; b[i][0] = b[i][0]*a[i][1]; a[i][1] = t; b[i][1] = t; } } } public static void symbol(int num) { Random rand = new Random(); c = new char[num]; for(int i=0;i<num;i++) { int n = rand.nextInt(4)+1; if(n==1) { c[i]='*'; } if(n==2) { c[i]='/'; } if(n==3) { c[i]='+'; } if(n==4) { c[i]='-'; } } } public static void count(int num) { for(int i=0;i<num;i++) { if(c[i]=='+') { add(i); } if(c[i]=='-') { minus(i); } if(c[i]=='*') { multiply(i); } if(c[i]=='/') { divide(i); } } } public static void add(int i) { r[i][0] = a[i][0] + b[i][0]; r[i][1] = a[i][1]; } public static void minus(int i) { r[i][0] = a[i][0] - b[i][0]; r[i][1] = a[i][1]; } public static void multiply(int i) { r[i][0] = a[i][0] * b[i][0]; r[i][1] = a[i][1] * b[i][1]; } public static void divide(int i) { r[i][0] = a[i][0]; r[i][1] = b[i][0]; } public static void setnumber(int num) { Random rand = new Random(); a = new int[num][2]; b = new int[num][2]; for(int i=0;i<num;i++) { int n = rand.nextInt(2)+1; int m = rand.nextInt(2)+1; if(n==1)//分数 { boolean flag = false; while(flag==false) { int x = rand.nextInt(max)+1; int y = rand.nextInt(max)+1; if(x<y) { a[i][0] = x; a[i][1] = y; flag = true; } } } if(n==2)//整数 { a[i][0] = rand.nextInt(max); a[i][1] = 0; } if(m==1)//分数 { boolean flag = false; while(flag==false) { int x = rand.nextInt(max)+1; int y = rand.nextInt(max)+1; if(x<y) { b[i][0] = x; b[i][1] = y; flag = true; } } } if(m==2)//整数 { if(c[i]=='/') { b[i][0] = rand.nextInt(max)+1; } else { b[i][0] = rand.nextInt(max); } b[i][1] = 0; } } for(int i=0;i<num-1;i++) { for(int j=i+1;j<num;j++) { while((a[i][0]==a[j][0]&&a[i][1]==a[j][1]&&b[i][0]==b[j][0]&&b[i][1]==b[j][1])||(a[i][0]==b[j][0]&&a[i][1]==b[j][1]&&b[i][0]==a[j][0]&&a[j][1]==b[i][1])) { int n=rand.nextInt(2)+1; int m=rand.nextInt(2)+1; if(n==1)//分数 { boolean flag = false; while(flag==false) { int x = rand.nextInt(max); int y = rand.nextInt(max); if(x<y) { a[j][0] = x; a[j][1] = y; flag = true; } } } if(n==2)//整数 { a[j][0] = rand.nextInt(max); a[j][1] = 0; } if(m==1)//分数 { boolean flag = false; while(flag==false) { int x = rand.nextInt(max); int y = rand.nextInt(max); if(x<y) { b[j][0] = x; b[j][1] = y; flag = true; } } } if(m==2)//整数 { if(c[j]=='/') { b[j][0] = rand.nextInt(max)+1; } else { b[j][0] = rand.nextInt(max); } b[j][1] = 0; } } } } } public static void show(int num) { for(int i=0;i<num;i++) { if(a[i][1]==0) { System.out.print(i+1+"、"+a[i][0]+" "+c[i]+" "); if(b[i][1]==0) { System.out.println(b[i][0]+" ="); } else { System.out.println(" ("+b[i][0]+"/"+b[i][1]+") ="); } } else { System.out.print(i+1+"、("+a[i][0]+"/"+a[i][1]+") "+c[i]+" "); if(b[i][1]==0) { System.out.println(b[i][0]+" ="); } else { System.out.println("("+b[i][0]+"/"+b[i][1]+") ="); } } } } }
运行结果截图: