JavaRush /Blog Jawa /Random-JV /Teka-teki nganggo kurung (Level 3, Kuliah 4)
Anatoliy
tingkat

Teka-teki nganggo kurung (Level 3, Kuliah 4)

Diterbitake ing grup
Ana tugas kaya ngono, aku percaya, sing nyebabake macem-macem emosi ing antarane akeh kadet JavaRush. Ing wulan September, nalika miwiti kursus, tugas kasebut dirumusake kaya ing ngisor iki: Ing ekspresi 1+2*3+4*5+6*7+8*9+10, aturake rong pasang kurung supaya nilai ekspresi dadi padha karo 537
Teka-teki kanthi kurung (tingkat 3, kuliah 4) - 1
Saiki, sawise bali menyang solusi, aku nemokake manawa tembung kasebut wis diganti, kudu dilebokake rong pasang kurung ing ekspresi 2 * 3 + 4 * 5 + 6 * 7 supaya nilai dadi padha karo 382. kondisi anyar, mesthi, luwih prasaja saka sadurunge, amarga jumlah opsi bisa wis suda dening kira-kira urutan gedhene. Nanging 85 isih cukup kanggo nglampahi siji utawa loro jam ing panelusuran manual. Temenan, tugas kasebut ora ana hubungane langsung karo pemrograman Java. Mulane aku ora ngrampungake. Masalah kasebut ora duwe solusi analitis adhedhasar pertimbangan utawa sifat-sifat angka, mung kekuwatan kasar, yaiku telusuran kabeh pilihan sing bisa ditindakake. Ing tangan liyane, iku ora kurang ketok sing iku karo bantuan saka program masalah saka jinis iki ditanggulangi. Mulane aku bali. Aku mung tak digunakake kanggo IDE, lan masalah mesthi dening tingkat 8 nyebul atine lan aku ora pikiran nglampahi utawa loro sore ing mecahaken mau. Ngisor iki carane sampeyan bisa ngatasi masalah iki nggunakake Jawa. Aku nggunakake kondisi lawas minangka basis kanggo conto. Kaping pisanan, kita butuh cara kanggo ngetung nilai ekspresi sing ditulis minangka senar. Kita ora bisa nemokake cara kasebut ing perpustakaan Jawa standar. Aku googled iki: http://www.cyberforum.ru/java-j2se/thread283139.html cukup cocok kanggo tujuan kita. Algoritma kasebut adhedhasar notasi Polandia sing mbalikke lan bisa digunakake kanggo senar sing bener sing ngemot papat operasi aritmetika lan kurung. Nggawe proyek anyar karo kelas PPN ing, nyalin lan nempel kode saka link menyang file. Masalah bisa ditanggulangi ing cara utama () kelas PPN. Nanging ora perlu. Ideologi Jawa adhedhasar mbagi masalah dadi subtugas cilik, sing saben-saben ditindakake ing kelas lan metode dhewe-dhewe. A pendekatan apik bakal kanggo ngatasi masalah ing kelas liyane, disimpen ing file kapisah. Mulane, nggawe kelas liyane sing bakal nulis algoritma kanggo enumerasi kurung. Kanggo ngetung Nilai saka senar, sampeyan kudu nelpon eval () cara saka kelas PPN: Contone, kaya iki.
System.out.println(PPN.eval(2*3+4));
utawa supaya
int result = PPN.eval(s2);
Ayo dideleng kanthi cetha ing baris 1+2*3+4*5+6*7+8*9+10 lan takon dhewe carane akeh cara kita bisa sijine kurung bukaan? Bisa diselehake ing sepuluh cara. Yen sampeyan menehi nomer karakter senar wiwit saka nol, banjur krenjang pambuka bisa diselehake ing posisi {0,2,4,6,8,10,12,14,16,18}. Nyelehake kurung, contone, ing posisi enem tegese sampeyan kudu njupuk kabeh karakter saka nul nganti limang klebu, banjur sijine kurung, banjur njupuk kabeh karakter saka enem kanggo mburi baris:
Teka-teki kanthi kurung (tingkat 3, kuliah 4) - 2
Kajaba iku, kurung tutup bisa diselehake ing posisi {1,3,5,7,9,11,13,15,17,20}. Rong nomer pungkasan ngrusak kabeh raspberry, kabeh posisi liyane beda karo loro, lan 17 lan 20 kanthi telu. Mulane, ora mung bisa ngumumake variabel sing ngemot nomer posisi braket penutupan lan nambah angka loro ing saben langkah sabanjure. Kita bakal nyimpen nilai posisi ing array:
int[] left = {0,2,4,6,8,10,12,14,16,18};
int[] right = {1,3,5,7,9,11,13,15,17,20};
Lan kita bakal nambah variabel indeks kanthi siji ing saben pengulangan loop sing tanggung jawab kanggo enumerasi opsi. Secara total, rong kurung pambuka lan rong kurung tutup dibutuhake, saben variabel indeks dibutuhake:
int indLeft1, indLeft2, indRight1, indRight2;
Tanda kurung ing ekspresi bisa diselehake kanthi rong cara:
(  )  (  )
(  (  )   )
Kanggo saben cara sampeyan kudu nulis algoritma dhewe; nimbang algoritma kanggo cara pisanan ngatur kurung. Enumerasi opsi nyata diwakili dening nested for loops:
for (int indLeft1=0;indLeft1<10;indLeft1++)
   for(int indRight1=indLeft1+1;indRight1<10;indRight1++)
      for (int indLeft2=indRight1+1;indLeft2<10;indLeft2++)
         for (int indRight2=indLeft2+1;indRight2<10;indRight2++)
Ing wiwitan program, kita miwiti variabel senar kanthi senar asli tanpa tanda kurung:
String s = "1+2*3+4*5+6*7+8*9+10";
Ing awak daur ulang batin kita mbentuk garis kanthi kurung:
String s2 = s.substring(0, left[indLeft1]) + "(" +
		 s.substring(left[indLeft1], right[indRight1]) + ")" +
		 s.substring(right[indRight1],left[indLeft2]) + "(" +
		 s.substring(left[indLeft2], right[indRight2]) + ")" +
		 s.substring(right[indRight2], s.length());
Pay manungsa waé menyang peculiarity saka substring () cara kelas String. Substring dipilih, nomer karakter pisanan padha karo parameter pisanan, lan nomer pungkasan padha karo parameter kapindho minus siji . ndeleng https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#substring(int,int) , malah ana conto kanggo ngurangi misunderstandings. Sawise nggawe senar kanthi kurung, kita ngetung nilai lan mbandhingake karo sing dibutuhake:
int result = PPN.eval(s2);
if (result == 537)
          System.out.println(s2);
Blok kanggo susunan nested kurung ditulis kanthi cara sing padha. Siji-sijine sing dakkarepake yaiku nalika kurung dipasang, kurung bukaan utawa tutup bisa ana ing posisi sing padha, contone.
1+((2*3+4*5+6)*7+8*9+10)
utawa
(1+2*(3+4*5+6*7+8))*9+10
Bener, iku kabeh. Sawise diluncurake, program sing ditulis kanthi bener ngasilake jawaban siji: 1+2*(3+4*(5+6*7)+8*9)+10
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION