Im sure we have seen algorithms to determine if a number is a power of 2.

Now, write an algorithm to determine if a number A is a power of a number B.

Example:

A=125

B=5

Is 125 a power of 5?

Both A and B must be positive whole numbers. The algorithm that I already wrote only handles a value of A up to 32k.

See what you can come up with!

*****

I do programs like these at compitions. Took me not even 5 mins.

Code:

`CLEAR`

CLS

INPUT "Number: ", A

INPUT "Base: ", B

Value = 0

IsIt = 0

index = -1

DO

IF Value > A THEN EXIT DO

index = index + 1

Value = B ^ index

IF Value = A THEN IsIt = 1: EXIT DO

LOOP

Message$ = "No, it is not a power of" + STR$(B)

IF IsIt = 1 THEN Message$ = "Yes, it is a power of" + STR$(B)

PRINT Message$

END

There you go!

Challenge Complete!

BTW, Test your program: A = 1, B = anynumber. 1 is a power of ANY number! anynumber ^ 0 = 1.

Using the laws of logs, consider:

a^y = x

Log both sides:

log(a^y) = log(x)

Using laws of logs:

ylog(a) = log(x)

Hence:

y = log(x) / log(a)

Written in code:

[syntax="QBASIC"]

cls

b# = -1

num# = -1

while (b# <= 0) and (num# <= 0)

line input "Number: ", num$

line input "Base: ", b$

num# = val(num$)

b# = val(b$)

if b# <= 0 then

print "Invalid base; must be greater than zero."

print

elseif num# <= 0 then

print "Invalid number; must be greater than zero."

print

end if

wend

' calculate the exponent.

exponent# = log(num#) / log(b#)

print num$ + " is " + b$ + "^" + ltrim$(str$(exponent#))

end

[/syntax]

This will also work for negative indices. For example, try putting the number as '0.2' and the base as 5.

-shiftLynx

Well the exponent due to the logs will be any number, even non integer.

See, 6 is a power of 5...just not an integer power. I think that the original challenge was to see whether it was a whole power.

Not exactly sure if this is what you want, but it seems simular to the above ones so I'll go on and submit:

[syntax="qbasic"]CLS

INPUT "Input Number: ", num1

INPUT "Input its #th root to check: ", num2

tst! = (num1) ^ (1 / num2)

text$ = STR$(tst!)

cont = 0

DO

cont = cont + 1

IF cont = LEN(text$) THEN EXIT DO

IF MID$(text$, cont, 1) = "." THEN PRINT num2; " is not the #th root of"; num1: END

LOOP

PRINT num2; " is the #th root of "; num1[/syntax]

Ah, yes, he does say they must be whole numbers.

New program:

[syntax="QBASIC"]

cls

b% = -1

num% = -1

while (b% <= 0) or (num% <= 0)

line input "Number: ", num$

line input "Base: ", b$

num% = int(val(num$))

b% = int(val(b$))

if b% <= 0 then

print "Invalid base; must be greater than zero."

print

elseif num% <= 0 then

print "Invalid number; must be greater than zero."

print

end if

wend

' calculate the exponent.

exponent! = log(num%) / log(b%)

if exponent! <> fix(exponent!) then

print num$ + " is not an integer power of " + b$

else

print num$ + " is a power of " + b$ + " (exponent=" + ltrim$(str$(int(exponent!))) + ")"

end if

end

[/syntax]

Sample:

Code:

`Number: 78125`

Base: 5

78125 is a power of 5 (exponent=7)

-shiftLynx

Quote:Code:

`CLEAR`

CLS

INPUT "Number: ", A

INPUT "Base: ", B

Value = 0

IsIt = 0

index = -1

DO

IF Value > A THEN EXIT DO

index = index + 1

Value = B ^ index

IF Value = A THEN IsIt = 1: EXIT DO

LOOP

Message$ = "No, it is not a power of" + STR$(B)

IF IsIt = 1 THEN Message$ = "Yes, it is a power of" + STR$(B)

PRINT Message$

END

Your solution is actually a program or a routine, not an algorithm, because it has a loop.

However, it does work, with one exception. If you enter a number greater than 1 as the A number and then a 1 for the B or base value, it goes into an endless loop.

Nice work, anyway.

*****