Escrever um programa que, dados os valores de
(float) e
(int), calcula as potências inteiras positivas e negativas:
, usando o seguinte algoritmo:
Passo 1
A ideia aqui é: dado um valor real x e um inteiro n, queremos calcular tanto x^n quanto x^(−n) só com multiplicação repetida e divisão. O conteúdo principal é uso de laço (loop) e manipulação de sinal de expoente.
Passo 2
Para entender o caso positivo, lembre que se n≥0 podemos definir k=n e calcular: inicializamos r=1 e fazemos um loop de 1 até k multiplicando r←r⋅x. Ao fim teremos r=x^n segundo a definição x^n = \underbrace{x⋅x⋅…⋅x}_{nvezes}.
Passo 3
Para lidar com expoentes negativos, usamos a propriedade x^{−n} = 1/x^n . Assim, se conseguirmos calcular x^{|n|} teremos também x^{−|n|} por inversão.
Passo 4
No caso geral em que n pode ser positivo ou negativo, defina k = |n|. Calcule r = x^k via loop (como no passo anterior). Se n≥0 então x^n = r e x^{−n} = 1/r. Se n<0 então x^n = 1/r e x^{−n} = r.
Passo 5
Agora basta juntar tudo num programa. Em pseudocódigo fica assim:
Resposta
// Pseudocódigo em estilo C
float x; // base real
int n; // expoente inteiro
int n; // expoente inteiro
// leitura de x e n (por exemplo, scanf ou input)
// scanf("%f %d", &x, &n);
// scanf("%f %d", &x, &n);
int k = (n >= 0) ? n : -n; // k = |n|
float r = 1.0;
// calcula x^k
for (int i = 0; i < k; i++) {
r = r * x;
}
float r = 1.0;
// calcula x^k
for (int i = 0; i < k; i++) {
r = r * x;
}
float pos, neg;
if (n >= 0) {
pos = r; // x^n
neg = 1.0 / r; // x^{−n}
} else {
pos = 1.0 / r; // x^n quando n<0
neg = r; // x^{−n} = x^{|n|}
}
if (n >= 0) {
pos = r; // x^n
neg = 1.0 / r; // x^{−n}
} else {
pos = 1.0 / r; // x^n quando n<0
neg = r; // x^{−n} = x^{|n|}
}
// printf(“x^%d = %f\n”, n, pos);
// printf(“x^{-%d} = %f\n”, n, neg);
// printf(“x^{-%d} = %f\n”, n, neg);
return 0;