Question

Ok donc je "écris un programme (en C ++) qui est censé prendre un certain nombre, passer par là, savoir si c'est des facteurs sont premiers, le cas échéant l'ajouter à une somme, puis sortie la somme de tous des principaux facteurs du nombre imputé.

Mon programme semble avec succès à faire mais il a 2 problèmes,

1) Le numéro que je suis censé tester pour voir la somme des principaux facteurs de ce nombre (600.851.475.143), mais il est trop grand pour un int. Je ne suis pas sûr de ce type de variable à utiliser, ou qui les types de variables pour changer. Je voudrais vraiment une explication claire sur ce si possible.

2) Pour une raison quelconque, lorsque le programme vérifie pour voir si 1 est un facteur du nombre, puis vérifie si 1 est premier, il dit 1 est premier, même si la première étape de la fonction de vérification pour voir si elle est premier est que si elle est 1 alors il n'est pas premier. J'ai trouvé une solution pour cela, en disant à soustraire 1 de la dernière valeur pour la somme de tous les facteurs premiers. Cependant, cela est une solution, pas vraiment trouver le problème. Si quelqu'un pouvait pointer au moins où le problème est que je l'apprécierais!

Voici le code, si vous avez des questions, s'il vous plaît demander!

#include <iostream>

using namespace std;

bool prime (int recievedvalue) { //starts a function that returns a boolean with parameters being a factor from a number
     int j =1;
    int remainderprime = 0;
    bool ended = false;
    while (ended == false){ //runs loop while primality is undetermined
        if (recievedvalue == 1){ //if the recieved value is a 1 it isn't prime
            //not prime
            break; // breaks loop
            return false;
            }
        remainderprime=recievedvalue%j; //gives a remainder for testing
        if ((remainderprime==0 && j>2) && (j!=recievedvalue || j == 4)){ //shows under which conditions it isn't prime
        ended=true;
        //not prime
        return false;
        }
        else if (j==1){
            j++;
            }
        else if ( recievedvalue==2 || j==recievedvalue ){ // shows what conditions it is prime
          ended = true;
          //prime
          return true;
            }
            else {
            j++;
                }
        }
    }


int multiple(int tbfactor){ //factors and then checks to see if factors are prime, then adds all prime factors together
    //parameter is number to be factored
    int sum = 0;
    bool primetest = false;
    int remainderfact;
    int i=1;
    while (i<=tbfactor){ //checks if a i is a factor of tbfactor
        remainderfact=tbfactor%i;
        if (remainderfact==0){ //if it is a factor it checks if it is a prime
            primetest = prime(i);
        }
            if (primetest ==true){ //if it is prime it add that to the sum
                sum += i;
                primetest=false;
                }
                i++;
            }
            sum --; // for some reason it always ads 1 as a prime number so this is my fix for it
            return sum;
    }

int main()
{

    int input;
    int output;
    cout << "Enter number to find the sum of all it's prime factors: ";
    cin >> input;
        output = multiple(input);
    cout << output;
    return 0;
}

Je suis vraiment nouveau à cela, comme quelques jours ou, donc je suis très familier avec des trucs en ce moment alors s'il vous plaît expliquer facilement pour moi! Je me réjouis de votre aide! Merci!

Était-ce utile?

La solution

Pour 1), vous devez utiliser un type plus grand. Un entier de 64 bits devrait être suffisant ici, donc changer vos ints à quel que soit le type entier 64 bits est appelé sur votre plate-forme (probablement long, ou peut-être long long).

Pour 2), le problème semble être que vous avez un break avant return false. La rupture provoque le code pour arrêter la boucle immédiatement pendant l'exécution continue et immédiatement après la boucle. Il ne semble pas que la valeur de retour est jamais attribué dans ce cas (que votre compilateur devrait être vous avertissement au sujet de), de sorte que la valeur réelle de retour est effectivement arbitraire.

Autres conseils

Alors que d'autres ont signalé un problème avec vos types de données, il y a quelques problèmes avec la structure de la première fonction qui a immédiatement attiré mon attention. (BTW, votre empreinte est enrageait.) Regardez cette version allégée:

bool prime (int recievedvalue) {
    // ...
    bool ended = false;
    while (ended == false){
        if (...){
            break; // jumps _behind_ the loop
            return false;
        }
        // ...
        if (...) {
            ended=true;
            return false; // leaves function returning true
        }
        else if (...) {
            // ...
        }
        else if (...) {
          ended = true;
          return true; // leaves function returning false
        }
        else {
            // ...
        }
    }
    // behind the loop

    // leaves function returning random value
}

D'une part, chaque fois que vous définissez la ended variable de contrôle de boucle, vous laissez la boucle en utilisant de toute façon d'autres moyens, de sorte que cette variable n'est pas nécessaire. Un while(true) ou for(;;) suffiraient.

En outre, que break saute derrière le corps de la boucle, mais il n'y a pas une déclaration là-bas, donc le code quitte la fonction sans retourner explicitement quoi que ce soit! C'est ce qu'on appelle l'invocation Comportement non défini . (Selon la norme C de votre programme est, à partir de ce moment, libre de faire ce qu'il veut, y compris le retour des valeurs aléatoires (la plupart des implémentations faire), le formatage de votre HD, invoquant méchant Nasal démons sur vous, ou revenir exactement ce que vous attendiez, mais seulement le dimanche.)

Enfin, ce break se produit juste avant un return false; qui est celui-ci n'a jamais atteint. En fait, votre compilateur doit mettre en garde que . Si elle ne le fait pas, vous êtes probablement pas la compilation au niveau d'alerte le plus élevé. (Vous devez activer ce. Toujours essayer de compiler proprement votre code au niveau d'alerte le plus élevé. ) Si elle le fait, apprendre à faire attention aux avertissements du compilateur . Ils sont un outil très important pour le diagnostic des problèmes lors de la compilation. (Rappelez-vous:. Les erreurs diagnostiquées lors de la compilation ne nécessitent aucun test et ne font jamais au client)

  1. Utilisez un nombre de 64 bits sur un système 64 bits, ou utiliser une bibliothèque qui fait précision arbitraire arithmétique
  2. Retirez le break avant la return false. En raison de la pause, l'exécution est reprise en dehors de la boucle et return false est jamais exécutée.

Pour stocker les valeurs supérieures à 4 octets (la capacité d'un int) vous avez une variété d'options. Reportez-vous à cette page pour ces options. Quant à savoir pourquoi vous êtes programme est de retour vrai pour le vérifier si oui ou non 1 est premier, consultez cette section de code:

if (recievedvalue == 1){ //if the recieved value is a 1 it isn't prime
   //not prime
   break; // breaks loop
   return false;
}

L'instruction break sortie et le retour faux ne sera jamais atteint. Pour résoudre le problème, supprimez l'instruction break.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top