Pereiti prie turinio

[C++] Kaip spręsti panaudojant kuo mažiau kodo?


Rekomenduojami pranešimai

Sveiki, programuotojai!

 

Uždavinys:

Aritmetiniame reiskinyje a [ ] b [ ] c [ ] d [ ] e = r

operacijų ženklai uždengti kvadratėliais.

Rezultatai - sveikųjų skaičių operacijos +, -, *, /.

 

Kaip spręsti programą parašant kuo mažiau kodo?

Neturiu daug patirties programavime.. Galvoju, kad žaisti reikia su daug sąlygos sakinių. Bet gal yra geresnių idėjų?

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Backtracking search + heuristika

Nors cia deriniu kiekis labai mazas (4^4 = 256) taigi brute force uztruktu kokia mikrosekunde

aisku jai demenu kiekis butu kurkas didesnis (pvz keli simtai), bruteforce nebebutu geras sprendimas

 

Beje ar veiksmai atliekami is eiles ar kreipiant demesi i operatoriu prioritetus ?

Redagavo Rintintin
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kadangi aiskus skaicius zenklu veiksmams atlikti, todel uztenka tik juos visus perrinkti.

 

Sprendimo ideja pateikta, vienintelis trukumas, kad atliekant dalybos veiksma imama sveika skaiciaus dalis, todel su dalyba ne visada pateikiamas teisingas rezultatas... Kam reikes, tas susitvarkys..

 

#include <iostream>

// Spausdinti zenkla lygtyje

char zenklas (int veiksmas)
{
   char $r;
   $r='.';
   switch(veiksmas)
   {
       case 1 :
           $r = '+';
           break;
       case 2 :
           $r = '-';
           break;
       case 3 :
           $r = '*';
           break;
       case 4 :
           $r = '/';
           break;
   }

   return $r;
}

// Atlikti veiksma su skaiciumi, 1 reiskia - prideti, 2 - atimti, 3 - padauginti, 4 - padalinti

void atlikti_veiksma (int skaicius, int veiksmas, int &rezultatas)
{
   switch(veiksmas)
   {
       case 1 :
           // std::cout << "1" << std::endl;
           rezultatas = rezultatas + skaicius;

           break;
       case 2 :
           // std::cout << "2" << std::endl;
           rezultatas = rezultatas - skaicius;
           break;
       case 3 :
           // std::cout << "3" << std::endl;
           rezultatas = rezultatas * skaicius;
           break;
       case 4 :
           // std::cout << "4" << std::endl;
           rezultatas = int (rezultatas / skaicius );
           break;
   }
}




int main(int argc, const char * argv[]) {
   // insert code here...
   int $i, $j, $x, $y;
   int $a, $b, $c, $d, $e, $r, $rezultatas;

   // SKAICIAI PAVYZDZIUI
   $a = 5;
   $b = 3;
   $c = 4;
   $d = 3;
   $e = 1;
   $r = 10;

   for ($i=1; $i<=4; $i++) {
       for ($j=1; $j<=4; $j++) {
           for ($x=1; $x<=4; $x++) {
               for ($y=1; $y<=4; $y++) {

                   $rezultatas = $a;
                   atlikti_veiksma($b, $i, $rezultatas);
                   atlikti_veiksma($c, $j, $rezultatas);
                   atlikti_veiksma($d, $x, $rezultatas);
                   atlikti_veiksma($e, $y, $rezultatas);

                   if ($rezultatas == $r) {

                       std::cout << $a << zenklas ($i) << $b << zenklas ($j) << $c << zenklas ($x) << $d << zenklas ($y) << $e << " = " << $r << std::endl;

                   }

               }
           }
       }
   }



   return 0;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose
#include <stdio.h>
double eval(int s,double a,double b) {
   switch (s) {
       case 0:return a+b;
       case 1:return a-b;
       case 2:return a*b;
       default:return a/b;
   }
}
int main () {
   const char*w[]={"+","-","*","/"};
   double a[6],o;int i,j;
   for (i=0;i<6;++i)
       scanf("%lf",&a[i]);
   for (i=0;i<256;++i) {
       o=a[0];
       for(j=0;j<4;++j)
           o=eval((i>>(j*2))&3,o,a[j+1]);
       if(o==a[5])break;
   }
   if(i>=256){
       printf("Not found\n");
       return 0;
   }
   printf("Solution %lf%s%lf%s%lf%s%lf%s%lf=%lf\n",
           a[0],w[i&3],a[1],w[(i>>2)&3],
           a[2],w[(i>>4)&3],a[3],
           w[(i>>6)&3],a[4],a[5]);
   return 0;
}

Redagavo alexcoldberg
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...