1 import java.util.InputMismatchException; 2 import java.util.Scanner; 3 public class Suan { 4 public static void main(String[] args) { 5 int []b;//设置数组来存放随机产生数 6 b=new int [4];int num=0;boolean panduan = true;int xuanze=1; 7 Scanner in=new Scanner(System.in); 8 do { 9 try { 10 11 System.out.println("请选择你想练习的题型:"); 12 System.out.println(" 1、分数的加减乘数法练习!"); 13 System.out.println(" 2、整数的加减乘数法练习!"); 14 xuanze=in.nextInt(); 15 16 if(xuanze==1||xuanze==2){ 17 panduan = false; } 18 else 19 System.out.println("你输入选项错误,请重新输入!"); 20 } catch (InputMismatchException e) { 21 System.out.println("你输入了错误的类型,请重新输入!"); 22 panduan = true; 23 24 } 25 } while (panduan); 26 panduan = false; 27 do { 28 try { 29 30 31 32 System.out.println("你想输出四则运算的个数是:"); 33 num=in.nextInt(); 34 panduan = false; 35 } catch (InputMismatchException e) { 36 System.out.println("你输入了错误的类型,请重新输入!"); 37 panduan = true; 38 } 39 } while (panduan); 40 41 String []a={"+","-","*","/"};//整数运算存放符号的数组 42 String res,res1 = null, sum1=null;//res为你输入的答案,res1为分数运算和整数运算除法中的正确答案 43 int []c;//符号的代数 44 int j=0,sum2=0;//sum2为整数运算中加减除的用户输入答案 45 int rshu = 0;//用户计算正确数 46 c=new int [4]; 47 if(1==xuanze)//选择应该输出怎样类型的算式 48 { 49 for(int i=0;i<4;i++)//产生符号的代数 50 { 51 c[i]=(int)(Math.random()*14/3); 52 } 53 for( j=0;j<num;j++)//不够num个数就继续输出算式 54 { 55 for(int i=0;i<4;i++)//产生1到10的随机数 56 { 57 b[i]=(int)( Math.random()*10); 58 } 59 60 if(b[0]>b[1]&&b[2]>b[3]&&b[0]!=0&&b[1]!=0&&b[2]!=0&&b[3]!=0)//真分数的前提 61 { 62 System.out.println("("+b[1]+"/"+b[0]+")"+ a[c[0]]+"("+ b[3]+"/"+b[2]+")"); 63 System.out.print("你的答案是:"); 64 res=in.next(); 65 switch(c[0]){//调用成员方法计算 66 case 0:res1=fracAdd(b[1],b[0],b[3],b[2]);break; 67 case 1:res1=fracSub(b[1],b[0],b[3],b[2]);break; 68 case 2:res1=fracMul(b[1],b[0],b[3],b[2]);break; 69 case 3:res1=fractDiv(b[1],b[0],b[3],b[2]);break; 70 } 71 if(!res.equals(res1))//比较答案 72 { 73 System.out.println("你的答案错误!正确答案为:"+res1); 74 } 75 else 76 { 77 rshu++;//用户计算正确数 78 } 79 } 80 else 81 j--; 82 } 83 } 84 if (2==xuanze)//选择整型数算式 85 { 86 87 for( int r=0;r<num;r++)//不够num个数就继续输出算式 88 { 89 int sum = -1;//真正的结果 90 for(int i=0;i<4;i++) 91 { 92 b[i]=(int)( Math.random()*100); 93 } 94 for(int i=0;i<4;i++) 95 { 96 c[i]=(int)(Math.random()*11/3); 97 } 98 c[0]+=1; 99 switch(c[0])//判断应该用什么符号 100 { 101 case 0 : 102 case 1 :sum=b[0]+b[1];break; 103 case 2 :sum=b[0]-b[1];break; 104 case 3 :sum=b[0]*b[1];break; 105 case 4 : sum1=fractDiv2(b[0],b[1]);break;//除号时调用函数,结果显示分数 106 } 107 /*if(sum<0)//减法计算结果不能为0 108 { 109 j--; 110 }*/ 111 if(c[0]==4)//如果符号是除号时 112 { 113 System.out.println(b[0]+a[c[0]-1]+b[1]+"="); 114 System.out.print("你的答案是:"); 115 res=in.next(); 116 if(!res.equals(sum1)) 117 { 118 System.out.println("你的答案错误!正确答案为:"+sum1); 119 } 120 else 121 rshu++; 122 } 123 else//如果符号不是除号时 124 { 125 System.out.println(b[0]+a[c[0]-1]+b[1]+"="); 126 System.out.print("你的答案是:"); 127 sum2=in.nextInt(); 128 if(sum2!=sum) 129 { 130 System.out.println("你的答案错误!正确答案为:"+sum); 131 } 132 else 133 { 134 System.out.println("答案正确!"); 135 rshu++; 136 } 137 //System.out.println(sum); 138 } 139 //System.out.println(r); 140 141 } 142 } 143 /*else 144 { 145 System.out.println("你输入的选项有误,请重新输入:"); 146 main( args); 147 }*/ 148 System.out.println("你一共答对了"+rshu+"道题"); 149 150 } 151 static String fracAdd(int first_numerator,int first_denominator,int second_numrator,int second_denominator){ 152 //分数加法 153 //需要调用求最大公约数的函数 154 155 int denominator; //分子 156 int numerator; //分母 157 158 if(first_denominator==second_denominator) //分母相同时加分子 159 { 160 denominator=first_denominator; 161 numerator=first_numerator+second_numrator; 162 } 163 else //否则同分比较分子 164 { 165 denominator=first_denominator*second_denominator; 166 numerator=first_numerator*second_denominator+first_denominator*second_numrator; 167 } 168 int gcd = gcd(numerator,denominator); //调用gcd方法约分 169 denominator = denominator / gcd; 170 numerator = numerator / gcd; 171 if(0==denominator/numerator) 172 { 173 String res="0"; 174 return res; 175 } 176 else 177 { 178 String zi1=String.valueOf(numerator);//把结果转换成字符串输出 179 String zi2=String.valueOf(denominator);//把结果转换成字符串输出 180 String zi3="/";//把结果转换成字符串输出 181 String res2=zi1+zi3+zi2;//把结果转换成字符串输出 182 183 return res2; } 184 185 } 186 static String fracSub(int first_numerator,int first_denominator,int second_numrator,int second_denominator){ 187 188 //需要调用求最大公约数的函数 189 190 int denominator; 191 int numerator; 192 193 if(first_denominator==second_denominator) //分母相同时加分子 194 { 195 denominator=first_denominator; 196 numerator=first_numerator-second_numrator; 197 } 198 else //否则同分比较分子 199 { 200 denominator=first_denominator*second_denominator; 201 numerator=first_numerator*second_denominator-first_denominator*second_numrator; 202 } 203 int gcd = gcd(numerator,denominator); 204 denominator = denominator / gcd; 205 numerator = numerator / gcd; 206 if(0==denominator/numerator) 207 { 208 String res="0"; 209 return res; 210 } 211 else 212 { 213 String zi1=String.valueOf(numerator); 214 String zi2=String.valueOf(denominator); 215 String zi3="/"; 216 String res2=zi1+zi3+zi2; 217 return res2; } 218 219 } 220 static String fracMul(int first_numerator,int first_denominator,int second_numerator,int second_denominator){ 221 222 //需要调用求最大公约数的函数 223 int denominator; 224 int numerator; 225 226 227 denominator=first_denominator*second_denominator; 228 numerator=first_numerator*second_numerator; 229 230 int gcd = gcd(numerator,denominator); 231 denominator = denominator / gcd; 232 numerator = numerator / gcd; 233 if(0==denominator/numerator) 234 { 235 String res="0"; 236 return res; 237 } 238 else 239 { 240 String zi1=String.valueOf(numerator); 241 String zi2=String.valueOf(denominator); 242 String zi3="/"; 243 String res2=zi1+zi3+zi2; 244 return res2; } 245 246 } 247 static String fractDiv(int first_numerator,int first_denominator,int second_numerator,int second_denominator){ 248 249 //需要调用求最大公约数的函数 250 251 int denominator; 252 int numerator; 253 254 numerator = first_numerator*second_denominator; 255 denominator = first_denominator*second_numerator; 256 257 258 259 int gcd = gcd(numerator,denominator); 260 denominator = denominator / gcd; 261 numerator = numerator / gcd; 262 String zi1=String.valueOf(numerator); 263 String zi2=String.valueOf(denominator); 264 String zi3="/"; 265 String res2=zi1+zi3+zi2; 266 return res2; 267 268 } 269 static String fractDiv2(int first,int second){ 270 271 //需要调用求最大公约数的函数 272 int denominator= first; 273 int numerator= second; 274 int gcd = gcd(numerator,denominator); 275 denominator = denominator / gcd; 276 numerator = numerator / gcd; 277 String zi1=String.valueOf(numerator); 278 String zi2=String.valueOf(denominator); 279 String zi3="/"; 280 String res2=zi1+zi3+zi2; 281 return res2; 282 } 283 static int gcd(int x,int y){ //利用辗转相除法求最大公约数 284 int r; 285 while( y!= 0) 286 { 287 r = x%y; 288 x = y; 289 y = r; 290 } 291 return x; 292 293 } 294 295 296 }
时间: 2024-08-13 12:56:59