2015-12-17 3 views
0

Je résous un problème où il faut faire la différence entre le nombre de diviseurs pairs et impairs, et je dois utiliser la fonction sqrt() parce que la limite du nombre est 10^9 donc en boucle sur le nombre entier n'est pas une cause de la limite de temps dépasser.Nombre de diviseurs pairs utilisant la racine carrée

cette fonction j'ai essayé de faire mais cela ne fonctionne pas parfaitement sur tous les nombres.

Ex. 4 & 48745.

Cas 4: 2 doit fournir en sortie des diviseurs même {2,4} et 1 diviseur impair {1} - la sortie de la fonction ci-dessous 3 même impair 1

48745 Case: doit fournir en sortie 0 même diviseurs et 4 diviseurs impairs {} - 1,5,9749,48745 la sortie de la fonction ci-dessous 2 même 2 impair

int di(int x) 
{ 
    int even=0,odd=0; 
    for(int i=1;i<=sqrt(x);i++) 
    { 
     if(x%i==0) 
     { 
      if(i%2) 
       odd++; 
      else 
       even++; 
     if(x/i %2==0 && x/i!=i) 
      even++; 
     else if(x/i!=i) 
      odd++; 
     } 
    } 
    return even-odd; 
} 
+1

* il ne fonctionne pas parfaitement sur tous les nombre * n'est pas beaucoup d'aide en tant que diagnostic. Si vous avez signalé certaines entrées d'essai, ce que vous attendez en tant que sortie et ce que vous obtenez en sortie, tout cela serait beaucoup plus utile. Le type d'erreur que fait votre programme est un outil de diagnostic très utile. Heck, vous pourriez même le comprendre vous-même le long du chemin ... –

+1

Vous êtes conscient de ce que ['sqrt'] (http://fr.cppreference.com/w/c/numeric/math/sqrt) prend un flottant -point argument, et plus important encore renvoie une valeur à virgule flottante. Les valeurs à virgule flottante ont toutes sortes de problèmes d'arrondi sur les ordinateurs, ce qui signifie que vous n'obtiendrez peut-être pas * exactement * ce que vous attendez, et ensuite * tronqué * à un entier pour la comparaison dans votre boucle. Cela signifie un résultat comme par ex. '1.9999566' sera tronqué à' 1'. –

+0

@JoachimPileborg Ok Je vais utiliser Ceil() pour la partie flottante mais je pense qu'il y a quelque chose qui ne va pas dans l'algorithme lui-même –

Répondre

0

Essayez code plus simple:

#include <iostream> 
#include <cmath> 

int divdiff(int x) 
{ 
    unsigned int even = 0; 
    unsigned int odd = 0; 
    const unsigned int sqrtx = std::sqrt(x); 

    for (int i = 1 ; i <= sqrtx ; ++i) 
    { 
     if (x % i == 0) 
     { 
      if (i % 2 == 0) 
      { 
       ++even; 
      } 
      else 
      { 
       ++odd; 
      } 
     } 
    } 

    even *= 2; 
    odd *= 2; 

    if (x == sqrtx * sqrtx) 
    { 
     if (x % 2 == 0) 
     { 
      --even; 
     } 
     else 
     { 
      --odd; 
     } 
    } 

    std::cerr << __func__ << '(' << x << "): even=" << even << ", odd=" << odd << std::endl; 
    return even - odd; 
} 

int main() 
{ 
    std::cout << divdiff(2*2) << std::endl; 
    std::cout << divdiff(2*3) << std::endl; 
    std::cout << divdiff(3*3) << std::endl; 
    std::cout << divdiff(7*11*13*17*23) << std::endl; 
} 
+1

Incorrect quand x est un carré. – gnasher729

+0

@ gnasher729 corrigé. – YSC