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

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

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

Καλησπερα, 

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

 

Λοιπον...

 

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

 

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
Δημοσ.

Θέλεις το γινόμενο των 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

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...