Portál AbcLinuxu, 12. května 2025 08:02

Dotaz: c++ mocnina na n

22.11.2012 17:28 marek33
c++ mocnina na n
Přečteno: 8089×
Odpovědět | Admin
Ahoj mám takový dotaz, v c++ jsem zkoušel vytvořit mocninu na n-tou, nevíte někdo jak na to ??

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.11.2012 17:34 chrono
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
V <cmath> je funkcia std::pow
22.11.2012 17:52 marek33
Rozbalit Rozbalit vše Re: c++ mocnina na n
myslel jsem pomocí funkce if
22.11.2012 18:12 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: c++ mocnina na n
Vyšel bych z: IF „hlad“ GOTO „lednice“
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
22.11.2012 18:14 Jary | skóre: 30 | blog: Jary má blog | Dům
Rozbalit Rozbalit vše Re: c++ mocnina na n
if není funkce. A když už bys to rád dělal nějak divně složitě, proč to neuděláš pomocí operátorů & | ^?
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
22.11.2012 18:16 chrono
Rozbalit Rozbalit vše Re: c++ mocnina na n
Dalo by sa použiť aj if, ale rozumnejšie by mohlo byť for (a if pre n=0 alebo 1)
22.11.2012 18:29 l4m4
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
Chceš kód obsaující if? Chceš efektivní algoritmus pro celočíselné mocniny? Všechno lze zařídit!
double mocnina(double x, int i)
{
    double r = 1.0;
    if (!i)
        return 1.0;
    bool negative = false;
    if (i < 0) {
        negative = true;
        i = -i;
    }
    for ( ; ; ) {
        if (i & 1)
            r *= x;
        if (!(i >>= 1))
            break;
        x *= x;
    }
    return negative ? 1.0/r : r;
}
Jen nevím, jak budeš vysvětlovat, jak to funguje...
22.11.2012 19:30 Radovan
Rozbalit Rozbalit vše Re: c++ mocnina na n
Pěkné, ale říká se "co je malé, to je hezké" :-D
double mocnina(double x,int y)
       {
       return x*(y>1?mocnina(x,--y):1);
       }
22.11.2012 19:43 l4m4
Rozbalit Rozbalit vše Re: c++ mocnina na n
Tam ovšem není žádný if. Cílem bylo mít tam nějaké ify ;)
22.11.2012 20:02 Radovan
Rozbalit Rozbalit vše Re: c++ mocnina na n
If tam je, jenomže maskovaný ;-)
double mocnina(double x,int y)
       {
       if (y>1)
          return x*mocnina(x,--y);
       else
          return 1;
       }
Ale jinak je to blbost dobrá akorát na hraní.
22.2.2013 12:32 libco
Rozbalit Rozbalit vše Re: c++ mocnina na n

Je tam chyba.

Má tam byť:

else

return x;

22.2.2013 13:23 Vtipnéř | skóre: 39 | blog: Vtipnéřův blog | Brno
Rozbalit Rozbalit vše Re: c++ mocnina na n
Spíš

if (y>0)

Jirka
Opening Windows is better than washing them. Clearing Windows (e.g. erasing or deleting) is even much better.
22.11.2012 19:45 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: c++ mocnina na n
"Hezké" možná, ale máte podstatně horší časovou složitost vůči exponentu a ještě budete muset spoléhat na inteligenci překladače, abyste se nedostal do problémů s přetečením zásobníku.
22.11.2012 19:47 l4m4
Rozbalit Rozbalit vše Re: c++ mocnina na n
Jo, a samozřejmě tohle počítá mocnina(x, 1000000) pomocí 999999 násobení, kdežto mnou uvedený kód pomocí 27 násobení ;)
23.11.2012 00:50 lertimir | skóre: 64 | blog: Par_slov
Rozbalit Rozbalit vše Re: c++ mocnina na n
Takhle to dopadne, když programátor kašle na výpočetní složitost algoritmů.
23.11.2012 09:36 l4m4
Rozbalit Rozbalit vše Re: c++ mocnina na n
Popravdě řečeno, takle by ten algoritmus byl vhodný pro GMP (kde samozřejmě mocnina nějak podobně implementována je), protože tam je cena nějakých bitových operací a dokonce i podmínek zanedbatelná vůči ceně násobení dvou čísel, a především pro jiné typy než double, které zvládne __builtin_powi()...

Jelikož jsou nejčastěji zapotřebí nízké mocniny, bylo by vhodné pro ně konkrétní výpočty zadrátovat -- a navíc to celé hodit do makra s __builtin_constant_p(), aby se to pro nízké předem známé mocniny optimálně inlinovalo.

A když se bavíme o C++, tak lze ostatně téhož dosáhnout šablonou, kde je ta mocnina coby parametr, a specializací pro nízké mocniny. Akorát nevím, zda by tam pak byly nějaké ify ;)
22.11.2012 19:36 Sten
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
Když jde o C++, použil bych šablony, ať to počítá rovnou překladač :-)
template <int base,
          int pow>
struct mocnina
{
    enum {
        value = base * mocnina<base, pow - 1>::value
    };
};

template <int base>
struct mocnina<base, 0>
{
    enum {
        value = 1
    };
};
23.11.2012 09:39 l4m4
Rozbalit Rozbalit vše Re: c++ mocnina na n
error: template instantiation depth exceeds maximum of 900
18.2.2013 17:16 Ivan
Rozbalit Rozbalit vše Re: c++ mocnina na n
Na MSVC je max hloubka rekurze sablon 2500. Na g++ je konfigurovatelna (je na to nejaky parameter).

22.2.2013 23:18 potato
Rozbalit Rozbalit vše Re: c++ mocnina na n
Na druhé straně potřebuje-li kód úroveň vnoření šablon větší než 900, někde je cosi podezřelého...
22.11.2012 21:22 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
jsem zkoušel vytvořit
Ano? A ako ďaleko si sa dostal?
pavlix avatar 22.11.2012 23:29 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
A já myslel, že domácí úkoly se řeší samostatně.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Řešení 3× (Xóža Hňabaj, Voty, Ash)
23.11.2012 10:33 pesspi | skóre: 7 | blog: hateblog
Rozbalit Rozbalit vše Re: c++ mocnina na n
Odpovědět | | Sbalit | Link | Blokovat | Admin
int mocnina(int x,y) {
  if (y == 2) return x*x;
  if (y == 3) return x*x*x;
  if (y == 4) return x*x*x*x;
  if (y == 5) return x*x*x*x*x;
  if (y == 6) return x*x*x*x*x*x;
  if (y == 7) return x*x*x*x*x*x*x;
  if (y == 8) return x*x*x*x*x*x*x*x;
  if (y == 9) return x*x*x*x*x*x*x*x*x;
  if (y == 10) return x*x*x*x*x*x*x*x*x*x;
  if (y == 11) return x*x*x*x*x*x*x*x*x*x*x;
  if (y == 12) return x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 13) return x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 14) return x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 15) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 16) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 17) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 18) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 19) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  return x;
}
Je to najlepsia verzia lebo obsahuje najviac ifov. Pre profesionalnu verziu si na zaciatok mozes doplnit assert(y<20);
23.11.2012 11:12 chrono
Rozbalit Rozbalit vše Re: c++ mocnina na n
Prípadne sa tam môže pridať ešte jedno if a rekurzia. :)
18.2.2013 17:10 Pavel Kocman
Rozbalit Rozbalit vše Re: c++ mocnina na n
Dělávali jsme to pomocí for ciklu, tím mohla být mocnina doopravdy libovolná, ale už si nevzpomínám. Taky to potřebuju.
22.2.2013 12:07 libco
Rozbalit Rozbalit vše Re: c++ mocnina na n

double mocnina_x(double cislo, int umocni_na)

{

     int i, vysledok = 1;

     for (i = 1; i <= umocni_na; i++)

     vysledok *= cislo;

     return vysledok;

}

22.2.2013 17:36 Bill Gates
Rozbalit Rozbalit vše Re: c++ mocnina na n
Mozna by se to dalo jeste zoptimalizovat z pohledu delky kodu programu ... Treba na arduinu, kde obcas setrime kazdy bajt by byla lepsi verze ponekud modifikovana (viz nize), dle testovaci kompilace to vychazi pro arduino Mega o 228 bytu lip :) a 228 bajtu na arduinu = misto na plno dalsich funkci. Tedy za predpokladu ze potrebujeme nezbytne nutne pouzit ify :D

void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}

int mocnina(int x,int y) {
  if (y == 2) return x*x;
  if (y == 3) return x*x*x;
  if (y == 4) return x*x*x*x;
  if (y == 5) return x*x*x*x*x;
  if (y == 6) return x*x*x*x*x*x;
  if (y == 7) return x*x*x*x*x*x*x;
  if (y == 8) return x*x*x*x*x*x*x*x;
  if (y == 9) return x*x*x*x*x*x*x*x*x;
  if (y == 10) return x*x*x*x*x*x*x*x*x*x;
  if (y == 11) return x*x*x*x*x*x*x*x*x*x*x;
  if (y == 12) return x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 13) return x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 14) return x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 15) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 16) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 17) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 18) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  if (y == 19) return x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x;
  return x;
}

void loop() { }

Binary sketch size: 4,084 bytes

void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}

int mocnina(int c,int y) {
  int x=c;
  if (y >= 2) x*=c;
  if (y >= 3) x*=c;
  if (y >= 4) x*=c;
  if (y >= 5) x*=c;
  if (y >= 6) x*=c;
  if (y >= 7) x*=c;
  if (y >= 8) x*=c;
  if (y >= 9) x*=c;
  if (y >= 10) x*=c;
  if (y >= 11) x*=c;
  if (y >= 12) x*=c;
  if (y >= 13) x*=c;
  if (y >= 14) x*=c;
  if (y >= 15) x*=c;
  if (y >= 16) x*=c;
  if (y >= 17) x*=c;
  if (y >= 18) x*=c;
  if (y >= 19) x*=c;
  return x;
}

void loop() { }

Binary sketch size: 3,856 bytes

22.2.2013 17:42 Kit
Rozbalit Rozbalit vše Re: c++ mocnina na n
Zkus to ještě porovnat s tím, co napsal libco. 3,856 B mi připadá strašně moc.
22.2.2013 18:09 Bill Gates
Rozbalit Rozbalit vše Re: c++ mocnina na n
void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}


double mocnina(double cislo, int umocni_na)
{
int i, vysledok = 1;
for (i = 1; i <= umocni_na; i++)
vysledok *= cislo;
return vysledok;
}

void loop() { }
Binary sketch size: 4,068 bytes

void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}


int mocnina(int cislo, int umocni_na)
{
int i, vysledok = 1;
for (i = 1; i <= umocni_na; i++)
vysledok *= cislo;
return vysledok;
}

void loop() { }
Binary sketch size: 3,454 bytes
22.2.2013 18:21 Bill Gates
Rozbalit Rozbalit vše Re: c++ mocnina na n
void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}


double mocnina(double x,int y) {
return x*(y>1?mocnina(x,--y):1);
}
       
void loop() { }
Binary sketch size: 3,950 bytes

void setup() {
int x=10;
int y=10;
int q=mocnina(x,y);
Serial.println(q);
}


int mocnina(int x,int y) {
return x*(y>1?mocnina(x,--y):1);
}
       
void loop() { }
Binary sketch size: 3,474 bytes
22.2.2013 18:57 Ivan
Rozbalit Rozbalit vše Re: c++ mocnina na n
A to co stenovo reseni? Vysledek vypocita kompilator behem kompilace a do zdrojaku dosadi primo konstantu:
0000000000400578 <main>:
  400578:       48 83 ec 08             sub    $0x8,%rsp
  40057c:       48 be 00 e4 0b 54 02    mov    $0x2540be400,%rsi
  400583:       00 00 00
  400586:       bf 98 06 40 00          mov    $0x400698,%edi
  40058b:       31 c0                   xor    %eax,%eax
  40058d:       e8 d6 fe ff ff          callq  400468 <printf@plt>
  400592:       5a                      pop    %rdx
  400593:       31 c0                   xor    %eax,%eax
  400595:       c3                      retq
0x2540be400 = 10^10

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.