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

προβλημα σε γλωσσα C


koala56

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

Δημοσ.
Έχω έναν πολύ μεγάλο αριθμό και θέλω να κάνω κάποιες πράξεις μεταξύ των ψηφίων του.Πως θα καταφέρω να τ'απομονώσω;Μόνο διαιρώντας κάτι έκανα,αλλά για μικρούς αριθμούς.Ευχαριστώ.

 

Για ακαιρέους:

>#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')

Δημοσ.

Λοιπόν,έγραψα κώδικα για να υπολογίσω το άθροισμα των ψηφίων του αποτελέσματος 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);
}

Δημοσ.
Τα βγάζει με την αντίστροφη φορά...Χμ...Πιστεύω ότι θα το διορθώσω.Ευχαριστώ.

 

Έχει κάποια λάθη ο κώδικας που έδωσα γιατί δεν τον δοκίμασα. Πάντως το πρόβλημα σου έχει και αυτή τη λύση:

>
u = fact(100);
for(sum = 0; u; sum += u % 10, u /= 10); 

Όπου u ακέραιος. Η συνάρτηση factorial είναι φυσική συνάρτηση, δηλαδή το σύνολο τιμών είναι { 1, 2, 6, ... }, οπότε δεν χρειάζεσαι το double precision. Μπορείς να χρησιμοποιήσεις τον τύπο unsigned long long αν θες παραπάνω ψηφία.

Δημοσ.
Λοιπόν,έγραψα κώδικα για να υπολογίσω το άθροισμα των ψηφίων του αποτελέσματος 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!

και θα πάρεις την απάντηση σου.(απλά το νούμερο είναι τεράστιο)

Δημοσ.

Το άθροισμα των ψηφίων του 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 μου το υπολόγιζε.:rolleyes:Δεν ξέρω.Ευχαριστώ για το χρόνο σας!

Δημοσ.

υπολόγισε το 29! με το πρόγραμμα σου (αυτό με το double)

και υπολόγισε το 29! με το calculator των windows.

 

το αποτέλεσμα είναι το ίδιο?αν όχι ποιο το σωστό?

 

και επειδή επιμένεις ότι το υπολογίζει δες το σωστό αποτέλεσμα του 100!

με όλα του τα ψηφία εδώ-->http://puzzles.nigelcoldwell.co.uk/nineteen.htm

 

 

ο μόνος τρόπος για να επιτύχεις αυτό που θες είναι να πραγματοποιήσεις τον πολλαπλασιασμό

όχι με το σύμβολο * αλλά όπως θα το έκανες εσύ στο χαρτί.Να "μάθεις" δηλαδή στον υπολογιστή να το κάνει με το χέρι!

Δημοσ.

Στα 14 ΄πρώτα ψηφία μου βγάζει το ίδιο.Προφανώς δεν αμφισνητώ αυτό που λες.Απλά προσπαθώ να δω γιατί δε γίνεται.Ίσως λόγω του του εύρους των αριθμών.Ευχαριστώ.

Δημοσ.
Το άθροισμα των ψηφίων του 100! θέλω να βρω.:)

 

Τώρα κατάλαβα πόσο μεγάλο είναι το νούμερο. Χρησιμοποίησε μια βιβλιοθήκη για μεγάλους αριθμούς.

http://gmplib.org/

Δημοσ.

Μια παρένθεση απο την προηγούμενη σελίδα.

Είδα οτι ο virxen75 χρησιμοποιεί ένα getchar για τα σκουπιδια του Kb.

Έχω συνηθίσει και χρησιμοποιώ το fflush(stdin), που καθαρίζει το buffer του πληκτρολογιου.

Υπάρχει καποια μέθοδος "προτεινόμενη" απο τις 2, ή κάποια τρίτη ?

Δημοσ.
Μια παρένθεση απο την προηγούμενη σελίδα.

Είδα οτι ο 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');

Δημοσ.

Μπορεις να εξηγήσεις για ποιο λόγο τη θεωρείς λάθος, γιατί σε δικό μου κώδικα δουλεύει μια χαρά.

 

Edit:

The C standard says that the effect of calling fflush() is

undefined if the most recent operation on a stream opened for update was an

input operation.

 

Αρα πάει ανάλογα την υλοποίηση του compiler.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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