Portál AbcLinuxu, 2. listopadu 2025 10:43
Ř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é ify ;)
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
ify ;)
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.