Πώς να διορθώσετε αυτό το βρόχο

ψήφοι
-3

Δεν μπορώ να προετοιμάσει i χωρίς να αλλάξετε την τιμή του x. Είμαι προσπαθεί να βρει το παραγοντικό μορφή αντίστροφη σειρά:

#include <iostream>
using namespace std;

void main()
{
    int x,i;
    cin>>x;
    float fact = (x*i);
    do{ 
        fact=fact*i;
        i=x-1;
        --x;
    }while (x>=0);
    cout<<fact<<endl; 
}

Περιμένω την έξοδο των 5! = 120

Δημοσιεύθηκε 24/10/2019 στις 11:56
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
0

Μια ελαφρώς τροποποιημένη έκδοση: (κανένας έλεγχος για υπέρβαση)

#include <iostream>
using namespace std;

int factorial (int x){  // a recursive function

    int res = 0;

    if (x ==1) return 1;
    else
        return x * factorial (x -1);   // call the function, with the immediate previous number
}

int main(void)
{
    int x = 0;
    int fact = -1;
    cin>>x;

    fact = factorial(x);
    cout<<fact<<endl; 
}

Δεν θα χρειαστεί επιπλέον μεταβλητή εδώ.

Απαντήθηκε 24/10/2019 στις 12:05
πηγή χρήστη

ψήφοι
2

Αφαιρέστε τη μεταβλητή iόπως δεν το χρειάζεστε. Επίσης διορθώσει την κατάσταση στο whileβρόχο αφού δεν θέλουμεfact*0

int main() {

    int x;
    std::cin >> x;
    float fact = 1;
    do {
        fact = fact * x;
        x--;
    } while (x > 0);
    std::cout << fact << std::endl;
}
Απαντήθηκε 24/10/2019 στις 12:09
πηγή χρήστη

ψήφοι
0
#include<iostream>
using namespace std;


int main()
{
    int x,i=1;
    cin>>x;
    float fact = x*i;
    do{ 
        fact=fact*i;
        i=x-1;
        --x;
    }while (x>0);
    if (x == 0)
       fact = 1;
    cout<<fact<<endl; 
}

Μερικές μικρές αλλαγές από τον κώδικά σας. Αυτό θα μπορούσε βοηθά :)

Απαντήθηκε 24/10/2019 στις 12:12
πηγή χρήστη

ψήφοι
2

Δεν προετοιμαστεί iκαι ο αλγόριθμος σας είναι ελαφρώς προβληματική. Σχόλιο τον κωδικό:

#include <iostream>

int main() // void isn't valid
{
    int i = 1; // initialize
    int x;
    std::cin >> x;
    float fact = (x * i);
    do {
        fact = fact * i;
        i = x - 1;
        --x;
    } while(x > 0); // if x==0 is accepted it means i==0 next round and "fact = fact * 0"
    std::cout << fact << "\n";
}

Θα μπορούσατε να γράψετε μια συνάρτηση σαν αυτό, αντί:

#include <limits> // std::numeric_limits

float fact(int x) {
    float fact = 1.f;

    if(x < 0) { // let's not deal with negative factorials
        fact = std::numeric_limits<float>::quiet_NaN();
    } else {
        for(; x > 0; --x) {
            fact *= static_cast<float>(x);
        }
    }

    return fact;
}

Και βεβαιωθείτε ότι φαίνεται ok:

int main() {
    for(int i = -1; i < 10; ++i) {
        std::cout << i << "\t" << fact(i) << "\n";
    }
}

Παραγωγή:

-1      nan
0       1
1       1
2       2
3       6
4       24
5       120
6       720
7       5040
8       40320
9       362880
Απαντήθηκε 24/10/2019 στις 12:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more