C6WGMN Δημοσ. 6 Απριλίου 2010 Δημοσ. 6 Απριλίου 2010 Έχω έναν πολύ μεγάλο αριθμό και θέλω να κάνω κάποιες πράξεις μεταξύ των ψηφίων του.Πως θα καταφέρω να τ'απομονώσω;Μόνο διαιρώντας κάτι έκανα,αλλά για μικρούς αριθμούς.Ευχαριστώ. Για ακαιρέους: >#define DIGIT(u, n) (unsigned)u/pow(10, n) % 10 όμως θα πρότυνα το παρακάτω > unsigned u = 123; char str[128]; int i; sprintf(str, "%u", u); for(i = 0; i < strlen(str); i++) printf("To %d-o psifio: %d\n", i + 1, str[strlen(str) - i] - '0')
Kleanthis Δημοσ. 6 Απριλίου 2010 Δημοσ. 6 Απριλίου 2010 Τα βγάζει με την αντίστροφη φορά...Χμ...Πιστεύω ότι θα το διορθώσω.Ευχαριστώ.
Kleanthis Δημοσ. 7 Απριλίου 2010 Δημοσ. 7 Απριλίου 2010 Λοιπόν,έγραψα κώδικα για να υπολογίσω το άθροισμα των ψηφίων του αποτελέσματος n! Ενώ γι'αριθμούς μικρούς λειτουργεί κανονικά,στο 100! πχ,δε δουλεύει.Μπορεί κανείς να πει μια ιδέα γιατί γίνεται αυτό παρακαλώ;Ευχαριστώ. >#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 160 double factorial(int); int main() { int a,sum=0,length=0; double ip,i=0; char str[N]; printf("Enter the number:"); scanf("%d",&a); ip=factorial(a); printf("%d!= %.f\n",a,ip); sprintf(str,"%f\n",ip); length=strlen(str)-8; printf("Length=%d\n\n\n",length); for(i=pow(10,(length-1));i>=1;i/=10) { sum+=(int)ip/i; ip=ip-(int)(ip/i)*i; } printf("The sum of the digits is:%d",sum); printf("\n"); getchar(); return 0; } double factorial(int n) { int i=0; double ip=1; for(i=1;i<=n;i++) ip*=i; return (ip); }
C6WGMN Δημοσ. 7 Απριλίου 2010 Δημοσ. 7 Απριλίου 2010 Τα βγάζει με την αντίστροφη φορά...Χμ...Πιστεύω ότι θα το διορθώσω.Ευχαριστώ. Έχει κάποια λάθη ο κώδικας που έδωσα γιατί δεν τον δοκίμασα. Πάντως το πρόβλημα σου έχει και αυτή τη λύση: > u = fact(100); for(sum = 0; u; sum += u % 10, u /= 10); Όπου u ακέραιος. Η συνάρτηση factorial είναι φυσική συνάρτηση, δηλαδή το σύνολο τιμών είναι { 1, 2, 6, ... }, οπότε δεν χρειάζεσαι το double precision. Μπορείς να χρησιμοποιήσεις τον τύπο unsigned long long αν θες παραπάνω ψηφία.
virxen75 Δημοσ. 7 Απριλίου 2010 Δημοσ. 7 Απριλίου 2010 Λοιπόν,έγραψα κώδικα για να υπολογίσω το άθροισμα των ψηφίων του αποτελέσματος n!Ενώ γι'αριθμούς μικρούς λειτουργεί κανονικά,στο 100! πχ,δε δουλεύει.Μπορεί κανείς να πει μια ιδέα γιατί γίνεται αυτό παρακαλώ;Ευχαριστώ. >#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define N 160 double factorial(int); int main() { int a,sum=0,length=0; double ip,i=0; char str[N]; printf("Enter the number:"); scanf("%d",&a); ip=factorial(a); printf("%d!= %.f\n",a,ip); sprintf(str,"%f\n",ip); length=strlen(str)-8; printf("Length=%d\n\n\n",length); for(i=pow(10,(length-1));i>=1;i/=10) { sum+=(int)ip/i; ip=ip-(int)(ip/i)*i; } printf("The sum of the digits is:%d",sum); printf("\n"); getchar(); return 0; } double factorial(int n) { int i=0; double ip=1; for(i=1;i<=n;i++) ip*=i; return (ip); } ανοιξε το calculator των windows και υπολόγισε το 100! και θα πάρεις την απάντηση σου.(απλά το νούμερο είναι τεράστιο)
Kleanthis Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Το άθροισμα των ψηφίων του 100! θέλω να βρω. ---------- Προσθήκη στις 01:59 ---------- Προηγούμενο μήνυμα στις 01:38 ---------- Έχει κάποια λάθη ο κώδικας που έδωσα γιατί δεν τον δοκίμασα. Πάντως το πρόβλημα σου έχει και αυτή τη λύση: > u = fact(100); for(sum = 0; u; sum += u % 10, u /= 10); Όπου u ακέραιος. Η συνάρτηση factorial είναι φυσική συνάρτηση, δηλαδή το σύνολο τιμών είναι { 1, 2, 6, ... }, οπότε δεν χρειάζεσαι το double precision. Μπορείς να χρησιμοποιήσεις τον τύπο unsigned long long αν θες παραπάνω ψηφία. Αυτό δουλεύει για μικρά νούμερα μόνο.Με το double μου το υπολόγιζε.Δεν ξέρω.Ευχαριστώ για το χρόνο σας!
virxen75 Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 υπολόγισε το 29! με το πρόγραμμα σου (αυτό με το double) και υπολόγισε το 29! με το calculator των windows. το αποτέλεσμα είναι το ίδιο?αν όχι ποιο το σωστό? και επειδή επιμένεις ότι το υπολογίζει δες το σωστό αποτέλεσμα του 100! με όλα του τα ψηφία εδώ-->http://puzzles.nigelcoldwell.co.uk/nineteen.htm ο μόνος τρόπος για να επιτύχεις αυτό που θες είναι να πραγματοποιήσεις τον πολλαπλασιασμό όχι με το σύμβολο * αλλά όπως θα το έκανες εσύ στο χαρτί.Να "μάθεις" δηλαδή στον υπολογιστή να το κάνει με το χέρι!
Kleanthis Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Στα 14 ΄πρώτα ψηφία μου βγάζει το ίδιο.Προφανώς δεν αμφισνητώ αυτό που λες.Απλά προσπαθώ να δω γιατί δε γίνεται.Ίσως λόγω του του εύρους των αριθμών.Ευχαριστώ.
C6WGMN Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Το άθροισμα των ψηφίων του 100! θέλω να βρω. Τώρα κατάλαβα πόσο μεγάλο είναι το νούμερο. Χρησιμοποίησε μια βιβλιοθήκη για μεγάλους αριθμούς. http://gmplib.org/
Pantelwolf Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Μια παρένθεση απο την προηγούμενη σελίδα. Είδα οτι ο virxen75 χρησιμοποιεί ένα getchar για τα σκουπιδια του Kb. Έχω συνηθίσει και χρησιμοποιώ το fflush(stdin), που καθαρίζει το buffer του πληκτρολογιου. Υπάρχει καποια μέθοδος "προτεινόμενη" απο τις 2, ή κάποια τρίτη ?
C6WGMN Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Μια παρένθεση απο την προηγούμενη σελίδα.Είδα οτι ο virxen75 χρησιμοποιεί ένα getchar για τα σκουπιδια του Kb. Έχω συνηθίσει και χρησιμοποιώ το fflush(stdin), που καθαρίζει το buffer του πληκτρολογιου. Υπάρχει καποια μέθοδος "προτεινόμενη" απο τις 2, ή κάποια τρίτη ? Η δικιά σου μέθοδος είναι λάθος και δεν δουλεύει. Δεν υπάρχει μία και μοναδική μέθοδος για το πρόβλημα, εξαρτάται πάντα από το είδος προγράμματος που γράφεις και τι μπορεί να περιέχει το stdin. Το πρόβλημα είναι το εικοστό του projecteuler http://projecteuler.net/index.php?section=problems&id=20 Λίνεται και έτσι: > char s[] = "9332621544394415268169923885626670049071596826438162146859" "29638952175999932299156089414639761565182862536979208272237582511852109168" "64000000000000000000000000"; int sum, i; for(i = sum = 0; i < sizeof s; i++, sum += s[i] - '0');
Pantelwolf Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 Μπορεις να εξηγήσεις για ποιο λόγο τη θεωρείς λάθος, γιατί σε δικό μου κώδικα δουλεύει μια χαρά. Edit: The C standard says that the effect of calling fflush() isundefined if the most recent operation on a stream opened for update was an input operation. Αρα πάει ανάλογα την υλοποίηση του compiler.
virxen75 Δημοσ. 8 Απριλίου 2010 Δημοσ. 8 Απριλίου 2010 μερικοί λόγοι για την αποφυγή χρήσης fflush(stdin); http://www.gidnetwork.com/b-57.html http://www.cprogramming.com/faq/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.