Portál AbcLinuxu, 12. května 2025 08:02
Řešení dotazu:
IF „hlad“ GOTO „lednice“
if
není funkce. A když už bys to rád dělal nějak divně složitě, proč to neuděláš pomocí operátorů & | ^
?
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...
double mocnina(double x,int y) { return x*(y>1?mocnina(x,--y):1); }
if
. Cílem bylo mít tam nějaké if
y ;)
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í.
Je tam chyba.
Má tam byť:
else
return x;
if (y>0)
Jirka
if
y ;)
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 }; };
error: template instantiation depth exceeds maximum of 900
jsem zkoušel vytvořitAno? A ako ďaleko si sa dostal?
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);
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
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
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
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 retq0x2540be400 = 10^10
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.