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

Kaprekar's Constant


SpirosLouis

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

Για την ιστορία ο δημοσιευμένος κώδικας λειτουργεί (ως έχει) σωστά και σε C++ Builder :)

 

Προσωπικά έλυσα το πρόβλημα από περιέργεια με recursion (αν έχεις διάθεση δοκίμασε το κάποια στιγμή) και ένα custom sort.

 

Πραγματικά δεν πάει το μυαλό μου σε αυτή τη λύση...αν θες μοιράσου τον κώδικά σου. Ο υποφαινόμενος είναι περίεργος να δει την υλοποίησή σου.

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

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

Πραγματικά δεν πάει το μυαλό μου σε αυτή τη λύση...αν θες μοιράσου τον κώδικά σου. Ο υποφαινόμενος είναι περίεργος να δει την υλοποίησή σου.

 

Ελπίζω να φανεί ενδιαφέρον..

 

 

/*
 * Kaprekar's constant using recursion,
 *  xdir.
 *
 * Compile with C++ Builder.
 *
 * For more info. read here: http://en.wikipedia.org/wiki/6174_(number)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void kaprekar(char *str);
char* sort(char*, char* desc);

int main(int argc, char **argv)
{
	/* Any input? */
	if(argc == 1)
		puts(" usage: four non repdigits");
	else {
		const int len = strlen(argv[1]);

		/* Is four digits long? */
		if(len == 4) {
			/* Is entire argv[1] made up of digits? */
			if(strspn(argv[1], "0123456789") == len) {
				/* Is entire argv[1] made of the same (first) character? */
                char s2[2] = "";
				*s2 = *argv[1];

				if(strspn(argv[1], s2) != len)
					kaprekar(argv[1]); /* begin calculation */
				else
					printf(" repdigits found - %s\n", argv[1]);
			}
			else
				printf(" not a number - %s\n", argv[1]);
		}
		else
			puts(" input more than four digits");
	}

	/* End */
	puts("\nPress Enter to exit..");
	getchar();

	return 0;
}

/*
 * Solve kaprekar using recursion thus:
 *  (re-)call kaprekar while str doesn't sum up to 6174 else return.
 */
void kaprekar(char *str)
{
	char str_asc[5] = "    ",
		*str_dsc    = sort(str, str_asc),
		 str_k[32]; /* 32 digits should be more than enough! */

	const int asc = atoi(str_asc),
			  dsc = atoi(str_dsc),
				k = max(asc, dsc) - min(asc, dsc);

	static int i = 1;

	printf("%d) %d\n", i++, k);

	if(k != 6174) {
		sprintf(str_k, "%.4d", k); /* pad "k" with leading zeroes (just in case) */
		kaprekar(str_k);
	}
}

/*
 * Selection sort "str" in descending order while storing it to "asc" in ascending
 *  order!
 */
char* sort(char *str, char* asc)
{
	int i,
		value = 0,
		swap_to = 0,
		swap_from,
		swap;

	do {
		value = swap = 0;

		for(i = 3; i >= swap_to; i--)
			if(str[i] > value) {
				value= str[swap_from = i];
				swap = 1;
			}

		if(swap) {
			str[swap_from] = str[swap_to];
			str[swap_to++] = value;

			asc[4 - swap_to] = value;
		}

	}while(swap);

	return str;
}
ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ:

 

3524

1) 3087
2) 8352
3) 6174

Press Enter to exit..

9831

1) 8442
2) 5994
3) 5355
4) 1998
5) 8082
6) 8532
7) 6174

Press Enter to exit..

8774
 
1) 3996
2) 6264
3) 4176
4) 6174
 
Press Enter to exit..
 
2111
 
1) 999
2) 8991
3) 8082
4) 8532
5) 6174
 
Press Enter to exit..
Υ.Γ.

Το πρόγραμμα έχει γραφθεί σε C++ Builder και φυσικά μπορεί να υπάρχουν bugs ή άλλες αβλεψίες.

 

 

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

Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort...

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

Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort...

Παράξενο μου ακούγεται αυτό ...

 

Η "compar" σου (δηλαδή η sort) αφαιρεί το προς ταξινόμηση από την qsort στοιχείο από τα υπόλοιπα οπότε με αυτό τον έμμεσο τρόπο (σύγκριση κάθε ψηφίου με τα υπόλοιπα) επιστρέφεις το αποτέλεσμα στην qsort ταξινομώντας τον πίνακα.

 

Αν βάλεις μια printf στην συνάρτηση sort θα δεις ότι για την ταξινόμηση του αριθμού 4321 (σε 1234) προκύπτουν τα παρακάτω αποτελέσματα:

Enter 4 digits number, not all digits same: 4321
x (3) - y (4) = -1
x (3) - y (1) = 2
x (2) - y (3) = -1
x (1) - y (3) = -2
x (4) - y (3) = 1
x (4) - y (3) = 1
x (1) - y (2) = -1
Η σημασία του n < 0, n == 0, n > 0 στην "compar" ορίζεται εδώ οπότε η qsort λειτουργεί σε ascending order.

 

Τώρα αν σε προβληματίζει ή τους προβληματίζει κάτι άλλο, ειλικρινά "δεν το πιάνω".

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

Να πω εδώ, μιας και είδα την παραπάνω sort, ότι έδειξα την sort του κώδικά μου σε 2 καθηγητές του τει μου και κανένας εξ αυτών δεν κατάφερε ποτέ να μου εξηγήσει γιατί και πως λειτουργεί αυτή η sort...

 

Ειναι μια συναρτηση που δειχνει το αποτελεσμα σύγκρισης δυο void* (μπορει να ειναι struct* ,int*, float* ..) 0,1 η -1.

Στο βιβλίο του K&R ,  5.11 δεικτες σε συναρτησεις έχει  την υλοποιηση της qsort.

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

Δεν μπορώ να καταλάβω πως μια συνάρτηση δέχετε const void *x. Δηλαδή; Οκ const. Όκ και ο δείκτης. Αλλά το void που κολλάει;

 

Επιπλέον δεν μπορώ να καταλάβω τα τόσα αστεράκια μέσα στην συνάρτηση. Που πάει το καθένα; Σαν type casting σε type casting μου θυμίζει!

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

O void* ειναι ο γενικός τύπος. Αν ηταν int* δεν θα μπορουσε να συγκρινει/ταξινομίσει π.χ. ενα array απο struct point (x,y).  

 

Επειδη περιμένει να ειναι void* το κανουμε cast στον τύπο που θέλουμε (int*) και περνουμε την  τιμή του με *(int*)

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

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

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

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

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

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

Σύνδεση

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

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