火影忍者Java版_式子生成终极版(java)

1 packageshizishengcheng;2

3 importjavax.swing.JOptionPane;4

5 classMyStack6 {7 inttop;8 intmaxSize;9 intarray[];10 public MyStack(intmaxSize)11 {12 this.maxSize =maxSize;13 array = new int[maxSize];14 top = 4;15 }16

17 publicMyStack(){}18

19 public void push(intvalue)20 {21 array[++top] =value;22 }23

24 public intpop()25 {26

27 return array[top--];28

29 }30

31 public intgetTopvalue()32 {33 returnarray[top];34 }35

36 public intgetTopvalue2()37 {38 inta;39 a=top--;40 top++;//使指针复原

41 returnarray[a];42 }43

44 public intisEmpty()45 {46 returntop ;47 }48

49 public booleanisFull()50 {51 return top == maxSize - 1;52 }53 }54

55 public classMain56 {57 static int [][] z = new int[30][20];//定义二维数组

58 static int [][] x = new int[30][11];//定义二维数组

59

60 public static int output(int a,int b,int c,int d,int e)//分数输出

61 {62 for(int i = a;i > 1;i--)63 {64 if(a % i == 0 && b % i == 0)65 {66 a = a /i;67 b = b /i;68 break;69 }70 }71 for(int i = c;i > 1;i--)72 {73 if(c%i == 0 && d % i == 0)74 {75 c = c /i;76 d = d /i;77 break;78 }79 }80 switch(e)81 {82 case 0 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "+" + "(" + c + "/" + d + ")" + "=?");break;83 case 1 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "-" + "(" + c + "/" + d + ")" + "=?");break;84 case 2 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "*" + "(" + c + "/" + d + ")" + "=?");break;85 case 3 : JOptionPane.showMessageDialog(null, "("+ a + "/"+ b + ")" + "/" + "(" + c + "/" + d + ")" + "=?");break;86 }87 return 1;88 }89 public static int fenshu_zhengquejieguo(int a,int b,int c,int d,inte)90 {91 int jieguo = 0;92 switch(e)93 {94 case 0: jieguo=(a * d + c * b) / (b * d);break;95 case 1: jieguo=(a * d - c * b) / (b * d);break;96 case 2: jieguo=(a * c) / (b * d);break;97 case 3: jieguo=(a * d) / (b * c);break;98 }99 returnjieguo;100 }101 public static int zhengshu_zhengquejieguo(inta[])102 {103 MyStack Fuhao = new MyStack(20);104 MyStack Shuzi = new MyStack(20);105 inte,c,p,e2,q;106 for(int i = 6;i < 13;i++)107 {108 if(i%2 == 1)//如果是符号压入符号栈

109 {110 Fuhao.push(a[i]);111 }112 else//否则压入数字栈

113 {114 Shuzi.push(a[i]);115 }116

117 if(i > 7 &&Fuhao.getTopvalue() > 1 && i % 2 == 0)//如果从左向右遇见乘除法就直接执行

118 {119 e =Fuhao.pop();120 c =Shuzi.pop();121 p =Shuzi.pop();122 switch(e)123 {124 case 2: Shuzi.push(c*p);break;125 case 3: Shuzi.push(p/c);break;126 }127 }128 if(i > 9 && Fuhao.getTopvalue() < 2 && Fuhao.getTopvalue2()< 2 && i % 2 == 0 && Fuhao.isEmpty() > 5)//如果遇见连续的两个加减法执行第一个

129 {130 e =Fuhao.pop();131 e2 =Fuhao.pop();132 c =Shuzi.pop();133 p =Shuzi.pop();134 q =Shuzi.pop();135 switch(e2)136 {137 case 0: Shuzi.push((q + p));break;138 case 1: Shuzi.push((q - p));break;139 }140 Shuzi.push(c);141 Fuhao.push(e);142 }143 }144

145 if(Shuzi.isEmpty() > 4)//最终肯定会剩下一组数还有最后一次加减运算

146 {147 e =Fuhao.pop();148 c =Shuzi.pop();149 p =Shuzi.pop();150

151 switch( e )152 {153 case 0: Shuzi.push((p + c));break;154 case 1: Shuzi.push((p - c));break;155 }156 }157

158 returnShuzi.getTopvalue();159

160 }161

162 public static int panduanchongfu(int a[],int ma,int mi,inty)163 {164 //---------------------------------------------用来判断是不是完全相同-----------------------------------------------------

165 int m = 1;166 while(m == 1)167 {168 for(int j = 0;j < y;j++)169 {170 if(a[0]==z[j][0]&&a[1]==z[j][1]&&a[2]==z[j][2]&&a[3]==z[j][3]&&a[4]==z[j][4]&&a[5]==z[j][5]&&a[6]==z[j][6])171 {172 a[0] = mi + (int)(Math.random()*ma);173 z[y][0] = a[0];174

175 a[1] = mi + (int)(Math.random()*ma);176 z[y][1] = a[1];177 break;178 }179

180 if( j == ( y - 1) )181 {182 m = 0;183 }184 }185 }186 //----------------------------------------------判断加法出现时候是不是完全相同------------------------------------------------------------

187 while(m == 1)188 {189 for(int j = 0;j < y;j++)190 {191 if(a[1]==0&&a[3]==z[j][3]&&a[4]==z[j][4]&&a[5]==z[j][5]&&a[6]==z[j][6]&&a[0]==a[2]&&a[3]<2)//加法在第一位,并且旁边两个数换了位置

192 {193 a[0] = mi + (int)(Math.random()*ma);194 z[y][0] = a[0];195 break;196 }197

198 if( j == ( y - 1) )199 {200 m = 0;201 }202 }203 }204 //----------------------------------------------判断乘法出现时候是不是完全相同------------------------------------------------------------

205 /*while(m == 1)206 {207 for(int j = 0;j < y;j++)208 {209

210

211 if( j == ( y - 1 ) )需要注意,这几种情况 一个乘号 1.在第一位 2*3 和 3*2 2.在第二位 前边没有乘除法 3.在第三位,第二位没有乘除法212 { 两个乘号 1.在前两个 1*2*3 和 3*2*1 和 2*3*1 等六种情况 2.在后两个,前边不是乘除法213 m = 0; 三个乘号214 }215 }216 }*/

217 //---------------------------------------------加法和乘法除法相邻出现并且重复---------------------------

218 /*加法连接乘除法 1+2*3 == 2*3+1219 */

220 return 1;221 }222

223 public static int tiaojianpanduan(int a[],int y,int ma,int mi)//整数输出

224 {225 for(int i = 6;i < 13;i++)226 {227 if(i%2 == 0)//挑出数字,如果直接筛选出符号那么不能修改之前的数字

228 {229 //---------------------------------------------------------------------------------------------------------------------------------------

230 while(a[i] == 0)//判断被除数为0的情况

231 {232 while(i > 6 && a[i - 1] == 3)233 {234 a[i] = mi + (int)(Math.random()*ma);235 z[y][i] = a[i];//更新原来数组

236 }237 }238 if(a[ i + 1 ] == 2 )//出现除法前边有乘法的情况,首先计算出乘法的结果

239 {//并且根据概率更新除法参与运算数的情况有可能永远不能实现结果为真分数,所以更新乘法参与运算数

240 if(a[ i + 3 ] == 3)241 {242 while(a[i] * a[i+2] >= a[i+4])243 {244 a[i+2] = mi + (int)(Math.random()*ma);245 z[y][i+2] = a[i+2];//更新原来数组

246 }247 }248 }249 if(a[i+1] == 3 && a[i-1] != 2)//有除法,其中包括只有一个除法,还有连续好几个除法,但是通过改变后一个数的规律可以有效的解决这个问题

250 {251 while(a[i] >= a[i + 2])252 {253 a[i+2] = mi + (int)(Math.random()*ma);254 z[y][i+2] = a[i+2];//更新原来数组

255 }256 }257 //--------------------------------------此上是处理出现除法的情况,此下是减法---------------------------------------------------------------

258 if(a[i+1]==1)//出现减法的情况

259 {260 if(i + 1 ==11 && a[i-3]==3 && a[i-1]==2 && a[i-4]/a[i-2]*a[i] < a[i+2])//减法在最后一个符号位置,并且前边是除法连接乘法

261 {262 while(a[i-4]/a[i-2]*a[i]

263 {264 a[i] = mi + (int)(Math.random()*ma);265 a[i+2] = mi + (int)(Math.random()*ma);266 z[y][i] = a[i];//更新原来数组

267 z[y][i+2] = a[i+2];//更新原来数组

268

269 }270 while(a[i-4]/a[i-2]*a[i] >= mi)//如果大于最小值,那么只需要更新减数

271 {272 a[i+2] = mi + (int)(Math.random()*ma);273 z[y][i+2] = a[i+2];//更新原来数组

274 }275 }276 if(a[i-1]==3 && i+1==9)//除法出现在减法前边一个符号,将减法变为加法.只有减法在第二个符号时有效

277 {278 a[i+1]=0;279 z[y][i+1] = a[i+1];//更新原来数组

280 }281 //此上两种情况是处理除法和减法同时出现并且互相影响的情况282 //减号附近有没有乘除法,提前计算

283 switch(i+1)284 {285 case 7:286 //减法在第一位的情况

287 if(a[i+3]==2 && a[i+5]<2)//- * _ 因为前一步已经将除法得数化为真分数,所以不用考虑除法的情况

288 {289 while(a[i]-a[i+2]*a[i+4]<0)290 {291 a[i+2] = mi + (int)(Math.random()*ma);292 z[y][i+2] = a[i+2];//更新原来数组

293 a[i+4] = mi + (int)(Math.random()*ma);294 z[y][i+4] = a[i+4];//更新原来数组

295 }296 }297 if(a[i+3]==2 && a[i+5]==2)//- * *同上步解释,不用考虑先乘后初的情况

298 {299 while(a[i]-a[i+2]*a[i+4]*a[i+6]<0)300 {301 a[i+2] = mi + (int)(Math.random()*ma);302 z[y][i+2] = a[i+2];//更新原来数组

303 a[i+4] = mi + (int)(Math.random()*ma);304 z[y][i+4] = a[i+4];//更新原来数组

305 a[i+6] = mi + (int)(Math.random()*ma);306 z[y][i+6] = a[i+6];//更新原来数组

307 }308 }309 if(a[i+3]==2 && a[i+5]==2)//- / *

310 {311 while(a[i]-a[i+2]/a[i+4]*a[i+6]<0)312 {313 a[i+2] = mi + (int)(Math.random()*ma);314 z[y][i+2] = a[i+2];//更新原来数组

315 a[i+4] = mi + (int)(Math.random()*ma);316 z[y][i+4] = a[i+4];//更新原来数组

317 a[i+6] = mi + (int)(Math.random()*ma);318 z[y][i+6] = a[i+6];//更新原来数组

319 }320 }break;321 case 9://减法在第二位的情况

322 if(a[i-1]==2&&a[i+3]==2)//* - *

323 {324 while(a[i-2]*a[i]

328 a[i+4] = mi + (int)(Math.random()*ma);329 z[y][i+4] = a[i+4];//更新原来数组

330 }331 }332 if(a[i+3]==2 && a[i-1]==0)//+ - *

333 {334 while( ( a[i-2] + a[i] ) < ( a[i+2] * a[i+4] ) )335 {336 a[i+2] = mi + (int)(Math.random()*ma);337 z[y][i+2] = a[i+2];//更新原来数组

338 a[i+4] = mi + (int)(Math.random()*ma);339 z[y][i+4] = a[i+4];//更新原来数组

340 }341 }342 if(a[i+3]==2 && a[i-1]==1)//- - *

343 {344 while( ( a[i-2] - a[i] ) < ( a[i+2] * a[i+4] ) )345 {346 a[i+2] = mi + (int)(Math.random()*ma);347 z[y][i+2] = a[i+2];//更新原来数组

348 a[i+4] = mi + (int)(Math.random()*ma);349 z[y][i+4] = a[i+4];//更新原来数组

350 }351 }352 if(a[i+3]<2 && a[i-1]==2)//* - _

353 {354 while(a[i-2]*a[i]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值