2017-07-20 4 views
-4

C programme pour trouver la nième puissance de l'entier m sans pow().Recherche de la nième puissance de l'entier m à travers le programme C sans pow()

Entrée:

m=3 n=2 
output: 
9.000 

tests pour valider le programme fonctionne comme prévu!

  1. M négatif
Input : -2 3 
output : -8.000 
  1. Pour négatif N
Input : 2 -3 
output : 0.125000 
  1. M négatif et N
Input : -2 -3 
output : -0.125000 

Cependant, je ne reçois pas la sortie désirée

void main() 
{ 

    signed int m, n; 
    int i; 
    float p; 
    clrscr(); 
    printf("Enter the number and its power (exponent)\n"); 
    scanf("%d%d",&m,&n); 
    p=1; 
    if (n==0) 
    { 
     printf("%d raised to %d is: %f",m,n,p); 
    } 

    if (n>0) 
    { 
     for(i = 0 ; i < n ; i++) 
      p*=m; 
     if(m>0) 
      printf("%d raised to %d is: %f",m,n,p); 
     if(m<0) 
      printf("%d raised to %d is: %f",m,n,-p); 
    } 

    if (n<0) 

    { 
     n=-n; 
     for(i = 0 ; i < n ; i++) 
      p*=m; 
     if(m>0) 
      printf("%d raised to %d is: %f",m,-n,1/p); 
     if(m<0) 
      printf("%d raised to %d is: %f",m,-n,-(1/p)); 
    } 
    getch(); 
} 

Can u veuillez fournir le bon programme pour les cas de test? Je ne peux pas déclarer signed float car il donne une erreur.

+3

Pour une entrée spécifiée, quelle est la sortie attendue et réelle? Avez-vous essayé de passer le code dans un débogueur? –

+2

Il est temps d'apprendre à utiliser un débogueur. –

+0

Cela vous dérange-t-il de réexécuter le troisième cas? Parce que [this] (https://ideone.com/hm0UDX) dit le contraire. –

Répondre

4

Le code pour les négatifs est incorrect. Vous ne pouvez pas aveuglément annuler le résultat lorsque la base m est négative. , mais . De plus, vous n'imprimez rien si m est nul!

Et int s sont signés par défaut, donc signed int est le bruit. float s sont également signés; mais ici vous pouvez aussi utiliser un double pour plus de précision. La valeur de retour de main doit être int.

Par conséquent, le code fixe serait (ajouter clrscr non standard s et getch s à votre goût;):

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int m, n, i; 
    double p = 1.0; 
    printf("Enter the number and its power (exponent)\n"); 
    scanf("%d%d",&m,&n); 

    if (n==0) { 
     printf("%d raised to %d is: %f",m,n,p); 
    } 

    else if (n > 0) { 
     for(i = 0; i < n; i++) 
      p*=m; 
     printf("%d raised to %d is: %f",m,n,p); 
    } 

    else { // n < 0 
     n = -n; 
     for (i = 0 ; i < n ; i++) 
      p*=m; 
     printf("%d raised to %d is: %f", m, -n, 1/p); 
    } 
} 
+1

J'ai été surpris quand il a réclamé ce 3ème cas de test pour valider les passes. Était à plusieurs reprises faire le calcul dans ma tête quand j'ai vu cette réponse :) –

+0

Merci:) ... Pourquoi utiliser double? quelle est la précision qu'il donne comme vous l'avez mentionné? –

0

Essayez de changer:

void main() 
{ 

    signed int m, n; 
    int i; 
    float p; 
    printf("Enter the number and its power (exponent)\n"); 
    scanf("%d%d",&m,&n); 
    p=1; 
    if (n==0) 
    { 
     printf("%d raised to %d is: %f",m,n,p); 
    } 

    if (n>0) 
    { 
     for(i = 0 ; i < n ; i++) 
      p*=m; 
     printf("%d raised to %d is: %f",m,n,p); 
    } 

    if (n<0) 

    { 
     n=-n; 
     for(i = 0 ; i < n ; i++){ 
      p*=m; 
     } 
     printf("%d raised to %d is: %f",m,-n,1/p); 

    } 

} 
0

@Antti Haapala bien identifié les erreurs dans le code de l'OP.


Comme une question d'entrevue relative à pow() substitut, certainement une solution qui prend des mesures log2 N (comme ci-dessous) est préférable à celui qui prend des mesures N (l'approche OP) où N est l'exposant.

La clé consiste à équerrer la base à chaque itération.
L'utilisation de log2 N au lieu de N entraîne moins d'erreurs dans les chiffres les moins significatifs.

Avec un exposant négatif, inversez simplement la base.

Utilisez double pour fournir au moins 10, généralement 17 chiffres décimaux de précision.

double powdii(int x, int y) { 
    double z = 1.0; 
    double base = x; 
    if (y < 0) { 
    base = 1.0/base; 
    } 
    while (y != 0.0) { 
    if (y % 2) { 
     z *= base; 
    } 
    y /= 2; 
    base *= base; 
    } 
    return z; 
}