Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2021-12-01, 20:44
  #1
Medlem
Försöker skriva en egen pow() function. I uppgiften får man inte använda den inbyggda.
Kod:
#include <iostream>
using std::cout;
using std::endl;
int sum, base, expo;

void power(int base, int expo) {
	for (int x = 0; x <= expo; x++) {
		sum = base;
		sum = base * base;
	}
	cout << sum << endl;
}

int main()
{
	power(2, 3);
}

Den printar ut 4 när den borde printa ut 8, vad är fel?
Citera
2021-12-01, 20:50
  #2
Medlem
kimdah2002s avatar
Citat:
Ursprungligen postat av bosscs2
Försöker skriva en egen pow() function. I uppgiften får man inte använda den inbyggda.
Kod:
#include <iostream>
using std::cout;
using std::endl;
int sum, base, expo;

void power(int base, int expo) {
	for (int x = 0; x <= expo; x++) {
		sum = base;
		sum = base * base;
	}
	cout << sum << endl;
}

int main()
{
	power(2, 3);
}

Den printar ut 4 när den borde printa ut 8, vad är fel?
sum = base * base ger alltid 2 * 2 oavsett hur många gånger du loopar och 2 * 2 är lika med 4
__________________
Senast redigerad av kimdah2002 2021-12-01 kl. 20:54.
Citera
2021-12-01, 20:50
  #3
Medlem
Citat:
Ursprungligen postat av bosscs2
for (int x = 0; x <= expo; x++) {
sum = base;
sum = base * base;
}
cout << sum << endl;
sum = base; ska vara först, innan du börjar for () - loopa
Citera
2021-12-01, 20:50
  #4
Medlem
jordrobsss avatar
För att du börjar med att sätta sum till 2(base) varje iteration testa att deklarera den utanför for loopen
Citera
2021-12-01, 21:00
  #5
Medlem
Prova

Kod:
#include <iostream>
using std::cout;
using std::endl;
int sum=1, base, expo;

void power(int base, int expo) {
	for (int x = 0; x < expo; x++) {
		sum *= base;
	}
	cout << sum << endl;
}

int main()
{
	power(2, 3);
}

och säg om det fungerar bättre.
Citera
2021-12-01, 21:09
  #6
Medlem
pop-ikons avatar
Rent allmänt kan man ju också reflektera över att du har gjort en funktion som kanske borde heta printPow eller printPower, till skillnad från pow som returnerar resultatet.
Citera
2021-12-01, 21:14
  #7
Medlem
Citat:
Ursprungligen postat av Katalysator
Prova

Kod:
#include <iostream>
using std::cout;
using std::endl;
int sum=1, base, expo;

void power(int base, int expo) {
	for (int x = 0; x < expo; x++) {
		sum *= base;
	}
	cout << sum << endl;
}

int main()
{
	power(2, 3);
}

och säg om det fungerar bättre.

Ok, det funkar.

Felet var alltså att efter varje iteration initierade jag samma värde i variabeln sum, i din lösning använder du:
Kod:
sum *= base;
Så ökar värdet efter varje loop. sum = sum * base.
Citera
2021-12-01, 21:20
  #8
Medlem
JohannesSnajdares avatar
Vad blir power(2, -1) ?
Citera
2021-12-01, 21:21
  #9
Medlem
Ja, det kan uttryckas på olika sätt. Viktigt är att initiera sum (inte det bäst valda namnet, men ändå) till ett och inte base, eftersom pow(2,0) och till och med pow(0,0) båda är lika med ett.
Citera
2021-12-01, 23:47
  #10
Medlem
Goto10s avatar
Jag hade skrivit en rekursiv funktion:
Kod:
int pow(int base, uint exp) {
  if (!exp) return 1;
  return base * pow(base, pow-1);
}
Nu skriver jag koden ovan på mobilen med ett antal öl innanför västen, så inget ansvar om den inte funkar
Citera
2021-12-02, 02:00
  #11
Medlem
DenAndraGrannens avatar
Vi har dom två möjligheterna:

Kod:
x^(2*y)     =    (x^2)^y 
x^(2*y + 1) = x*((x^2)^y)



Kod:
int pow(int base, uint exp) {
  if (!exp) return 1;
  if (exp == 1) return base;
  return pow(base, pow & 1) * pow(base * base, pow >> 1);
}

och

Kod:
int pow(int base, uint exp) {
  if (!exp) return 1;
  return (pow & 1 ? base : 1) * pow(base * base, pow >> 1);
}

borde fungera tycker jag (utan att testa)
Citera
2021-12-02, 16:59
  #12
Medlem
Citat:
Ursprungligen postat av Katalysator
Prova

Kod:
#include <iostream>
using std::cout;
using std::endl;
int sum=1, base, expo;

void power(int base, int expo) {
	for (int x = 0; x < expo; x++) {
		sum *= base;
	}
	cout << sum << endl;
}

int main()
{
	power(2, 3);
}

och säg om det fungerar bättre.

Efter fler tester märker jag att den inte fungerar. Jag vill ha en metod som fungerar exakt som denna:
Kod:
int power(int base, int expo) {
	sum = pow(base, expo);
	return sum;
	}
Jag vill byta ut pow() mot en egenskriven metod.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback