式子生成終極版(java)

来源:http://www.cnblogs.com/sisi-job/archive/2016/04/12/5384311.html
-Advertisement-
Play Games

在修改完善過程中博客園出現錯誤,誤刪。現在補上! 源代碼: 結果截圖: 整數部分: 分數部分: 結果分析:數據,消息都是通過通知框輸入輸出。 總結:還有功能尚未實現,而且實現的功能也不盡完美。 比如條件控制處不能夠產生負數,是利用暴力窮舉,而沒有特殊的辦法。 恢復內容結束 ...


在修改完善過程中博客園出現錯誤,誤刪。現在補上!

 
整體設計思想:
  1.巨集定義兩個二維數組,作為整數和分數計算的儲存單位
   
  2.隨機生成數字,符號用0123代替。
   
  3.在進棧前先根據if條件判斷生成函數中不符合要求的各個條件,然後更新更新巨集定義下的數組。
   
  4.在shuchu函數里進行輸出。輸出具體方法就是根據奇數為符號,偶數為數字的規律數字進行直接輸出,符號通過判斷輸出
   
  5.在jieguojisuan函數中進行計算,方法為應用棧,建立兩個棧,一個為數字棧一個為符號棧,計算思想就是遇見兩個連續的加減法就計算前一個,遇見乘
  除法就直接計算。計算的細節就是,將數字棧的兩個數字和符號棧的一個符號出棧,然後進行計算,將結果壓回數字棧。
   
  最終版本實現的功能和實現方法如下
  1.能夠實現四則混合運算
  解決方法:將數組擴展,儲存多個計算數字。然後根據隨機生成的數字生成式子。
   
  2.能夠實現計算結果判斷
  解決方法:應用棧的思想,計算結果
   
  3.除法生成數字都為真分數,減法得數不能為負數
  解決方法:列舉出來具體情況
   
  4.生成隨機數字
  應用時間函數,隨機生成數字
  如下生成在mi在ma之間的隨機整數
  srand((unsigned)time(NULL));
  a[i+2] = rand() % ma + mi;
   
  5.能夠判斷重覆
  只能判斷完全重覆
 

源代碼:

  1 package shizishengcheng;
  2 
  3 import javax.swing.JOptionPane; 
  4 
  5 class MyStack 
  6 {
  7     int top;    
  8     int maxSize;   
  9     int array[];
 10     public MyStack(int maxSize) 
 11     {  
 12         this.maxSize = maxSize;  
 13         array = new int[maxSize];  
 14         top = 4;  
 15     } 
 16     
 17     public MyStack(){}
 18 
 19     public void push(int value) 
 20     {  
 21         array[++top] = value;  
 22     }
 23     
 24     public int pop() 
 25     {  
 26         
 27         return array[top--]; 
 28         
 29     }
 30     
 31     public int getTopvalue() 
 32     {  
 33         return array[top];  
 34     }
 35     
 36     public int getTopvalue2() 
 37     {  
 38         int a;
 39         a=top--;
 40         top++;//使指針複原
 41         return array[a];  
 42     }
 43     
 44     public int isEmpty() 
 45     {  
 46         return top ;  
 47     }
 48     
 49     public boolean isFull() 
 50     {  
 51         return top == maxSize - 1;  
 52     }
 53 }
 54 
 55 public class Main 
 56 {
 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,int e)
 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         return jieguo;
100     }
101     public static int zhengshu_zhengquejieguo(int a[])
102     {
103         MyStack Fuhao = new MyStack(20);
104         MyStack Shuzi = new MyStack(20);
105         int e,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         return Shuzi.getTopvalue();
159 
160     }
161 
162     public static int panduanchongfu(int a[],int ma,int mi,int y)
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+1
219         */
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]<mi)//前邊計算出來的數字之和小於隨機生成數的最小值,那麼就更新最後一個數字和乘法的後一個數字
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]<a[i+2]*a[i+4])
325                                 {
326                                     a[i+2] = mi + (int)(Math.random()*ma);
327                                     z[y][i+2] = a[i+2];//更新原來數組
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]<a[i+2])
355                                 {
356                                     a[i+2] = mi + (int)(Math.random()*ma);
357                                     z[y][i+2] = a[i+2];//更新原來數組
358                                 }
359                             }
360                         case 11://減法在第三位的情況
361                             if(a[i-3]==2&&a[i-1]==2)//* * -
362                             {
363                                 while(a[i-4]*a[i-2]*a[i]<a[i+2])
364                                 {
365                                     a[i+2] = mi + (int)(Math.random()*ma);
366                                     z[y][i+2] = a[i+2];//更新原來數組
367                                     a[i] = mi + (int)(Math.random()*ma);
368                                     z[y][i] = a[i];//更新原來數組
369                                 }
370                             }
371                             if(a[i-3]==0&&a[i-1]==2)//+ * -
372                             {
373                                 while(a[i-4]+a[i-2]*a[i]<a[i+2])
374                                 {
375                                     a[i+2] = mi + (int)(Math.random()*ma);
376                                     z[y][i+2] = a[i+2];//更新原來數組
377                                     a[i] = mi + (int)(Math.random()*ma);
378                                     z[y][i] = a[i];//更新原來數組
379                                 }
380                             }
381                             if(a[i-3]==1&&a[i-1]==2)//- * -
382                             {
383                                 while(a[i-4]-a[i-2]*a[i]<a[i+2])
384                                 {
385                                     a[i+2] = mi + (int)(Math.random()*ma);
386                                     z[y][i+2] = a[i+2];//更新原來數組
387                                 }
388                             }
389                             if(a[i-3]==0&&a[i-1]==3)//+ / -
390                             {
391                                 while(a[i-4]+a[i-2]/a[i]<a[i+2])
392                                 {
393                                     a[i+2] = mi + (int)(Math.random()*ma);
394                                     z[y][i+2] = a[i+2];//更新原來數組
395                                     a[i] = mi + (int)(Math.random()*ma);
396                                     z[y][i] = a[i];//更新原來數組
397                                 }
398                             }
399                             if(a[i-3]==1&&a[i-1]==3)//-

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 情景一:不存在Ajax非同步操作 1 使用背景:會議室預定管理系統中,當表單提交的時候需要驗證預約的時間是否符合預定規則(不需要通過訪問伺服器),否則提示錯誤信息,阻止表單提交。 2 相關技術點: form的兩個事件 3 Demo 頁面代碼: JS代碼: 情景二:需要Ajax非同步操作 1 使用背景:會 ...
  • LinkedList及常用API ① LinkedList 鏈表 ② LinkedList類擴展AbstractSequentialList並實現List介面 ③ LinkedList提供了一個鏈表數據結構 ④ LinkedList有兩個構造方法 a) LinkedList() b) LinkedL ...
  • Spring4框架 Spring4框架 主講:鄒波 主講:鄒波 類型:SSH 類型:SSH 適合對象:學習完javase、資料庫技術、jdbc者 適合對象:學習完javase、資料庫技術、jdbc者 Spring4.0作為一個廣泛使用的開源框架,它由Rod Johnson創建。它是為瞭解決企業應用開 ...
  • 在交互模式下: 如果要讓Python列印出指定的文字,可以用print語句,然後把希望列印的文字用單引號或者雙引號括起來,但不能混用單引號和雙引號: >>> print 'hello,world'hello,world在交互模式下雖然方便,但是執行一次代碼無法保存,接下來我們用文本編輯器來編寫並且可 ...
  • Red is A Color: class Red extends Color{} class Blue extends Color{} class Yellow exrends Color{} She has A friend: class She{ private Person friend; ...
  • 多線程:Simultaneous Multithreading,簡稱SMT。 並行、併發 並行性(parallelism)指兩個或兩個以上的事件在同一時刻發生,在多道程式環境下,並行性使多個程式同一時刻可在不同CPU上同時執行。 併發的實質是一個物理CPU(也可以多個物理CPU) 在若幹道程式之間多 ...
  • Atitit.木馬病毒的操作註冊表原理 系統服務管理器 atiSysService 1. atiSysService1 2. atiSysService 原理1 3. Java code1 4. 參考5 1. atiSysService http://localhost:8080/regsitMan ...
  • /* * 功能:加深對事件處理機制的理解 * 1.通過控制上下左右鍵,來控制一個小球的位置 */package com.test1;import java.awt.*;import javax.swing.*;import java.awt.event.*; public class Demo9_4 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...