Προς το περιεχόμενο

Εχω κολλησει σε μια ασκηση της C


BloodDonor89

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπερα, 

εχω κατι ασκησεις απο την σχολη, αλλα εχω κολλησει σε μια, δεν θεωρω οτι ειναι κατι δυσκολο, αλλα τωρα ειλικρινα εχω κολλησει...

 

Λοιπον...

 

πρεπει το προγραμμα να κανεις την ακολουθει πραξη:

 

1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9*1/10

 

αυτη η πραξη ομως να γινει με for.

 

Δοκιμαζω να κανω αυτο. δηλαδη με διπλη for αλλα δεν μου βγαινει, οταν το τρεχω μου βγαζει αποτελεσμα 0.

#include <stdio.h>
int main (void)

{
    int p, i, p1;
    p=1;
p1=1
    for (i=1; i<=10; i++)
     {
         p1=p/i;
         for (i=2; i<=10; i++)
         p=p/i*p1;
     }
    printf("%f", p);
}

δοκιμασα παρα πολλες παραλαγες. Ακομα κι ο πολλαπλασιασμος να γινει ακριβως πριν την print. αλλα αυτο νομιζω πως ειναι μαθηματικο λαθος.

 

δοκιμασα κι αυτο

#include <stdio.h>
int main (void)

{
    int p, i;
    p=1;
    for (i=1; i<=10; i++)
    p=1/p*1/p;
    printf("%f", p);
}

αλλα ουτε αυτο εβγαλε καποιο αποτελεσμα...

 

Καθε συμβουλη ειναι δεκτη.

Επεξ/σία από BloodDonor89
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 57
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Θέλεις το γινόμενο των 1/i, όπου i από 2 έως και 10.

Δεν χρειάζεσαι διπλό for.

Ένα p που αρχικά είναι 1, και το οποίο πολλαπλασιάζεις κάθε φορά με 1/i.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators
Δημοσ. (επεξεργασμένο)
#include <iostream>
 
using namespace std;
 
int main(int argc, char **argv)
{
    float prod= 1.0;
    for (int i = 2; i <= 10; i++)
        prod *= 1.0/i;
    cout << "Result: " << prod << endl;
 
    return 0;
}

Σου βγάζει 0 γιατί στη C++ (και στη C, και αυτό που έχεις γράψει είναι C) οι πράξεις μεταξύ 2 μεταβλητών ίδιου τύπου δίνουν αποτέλεσμα τον ίδιο τύπο. Δηλαδή, αν διαιρέσεις μια int με μια άλλη int, το αποτέλεσμα θα είναι int. Που σημαίνει ότι αν int x = 3 και int y = 5, τότε x/y = 0, όχι 0.6.

Επεξ/σία από Kercyn
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι σωστα, C γραφω. Μπερδευτηκα απο το προγραμμα με το οποιο γραφω.

 

Εννοεις δηλαδη καπως ετσι;

{
	int i;
	float p;
	p=1;
	for (i=2; i<=10; i++)
	p=p*1/i;

	printf("%f", p);
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Ναι, αυτό πρέπει να σου δουλεύει.

 

Το 1/i άλλαξέ το σε 1.0/i, γιατί και το 1 και το i είναι int, οπότε θα σου επιστρέψουν int.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators
int i;
float p = 1.0;
for (i = 2; i <= 10; i++)
    p = p * 1.0/i;

printf("%.15f\n", p);

Αυτό μου δίνει αποτέλεσμα 0.000000275573200.

 

Το .15 στην printf του λέει με πόση ακρίβεια να εκτυπώσει το p.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εναλλακτικά:

#include <stdio.h>
#include <float.h>

#define ERROR DBL_MAX

double magic(int from, int to);

int main(void)
{
	double m;

	if (ERROR == (m = magic(2, 10)))
		printf("ERROR: \"to\" must be larger than \"from\"\n");
	else
		printf("%.15lf\n", m);

	return(0);
}

double magic(int from, int to)
{
	if (to == from) return(1.0 / to);
	else if (to < from) return(ERROR);
	return((1.0 / to) * magic(from, to - 1));
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες


#include <iostream>
 
using namespace std;
 
int main(int argc, char **argv)
{
    float prod= 1.0f;
    for (float i = 2.f; i <= 10.f; i+= 1.f)
        prod *= 1.0f/i;
    cout << "Result: " << prod << endl;
 
    return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν σε ενδιαφέρει ο συνδυασμός ακρίβειας και ταχύτητας, δοκίμασε με τον κώδικα που σου έδωσε παραπάνω ο Timonkaipumpa.

 

Αν μάλιστα δεν σε ενδιαφέρει να είναι generic, δηλαδή στοχεύει μονάχα στην συγκεκριμένη άσκηση και μόνο, τότε δεν χρειάζεσαι ούτε να είναι double η μεταβλητή. Δηλαδή...

 

...
    float prod = 1.f;
    for (int i=2; i < 11; i++) {
        prod *= i;
    }
    printf( "%.15f\n", 1.f/prod );
...
//Έξοδος:
// 0.000000275573192
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Θα μπορούσε να είναι και

int indx = 0;
int max_number = 10;
double p = 1.0;
for (; indx <= max_number; indx++, p *= (double) indx);
double result = 1/p;

 

Κάνεις ένα τζάμπα iteration ή μου φαίνεται; :lol:

float prod = 1.f;
for (int i=1; ++i < 11; prod *= i);
printf( "%.15f\n", 1.f/prod );
ή ...

float prod = 1.f;
int   i = 10;
while (prod *= i, i-- != 1);
printf( "%.15f\n", 1.f/prod );
EDIT: http://www.insomnia.gr/topic/515793-εχω-κολλησει-σε-μια-ασκηση-της-c/page-2#entry52939719 Επεξ/σία από migf1
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...