Αυτή η άσκηση είναι Bonus, δηλαδή η λύση της δεν είναι απαραίτητη για να πάρει κάποιος/α όλες τις μονάδες της Εργασίας 1. Σε αυτήν την άσκηση θα ασχοληθούμε με μια κατηγορία αριθμών που ονομάσαμε άψογα τετράγωνα.
Ορισμός 6. Ένας φυσικός αριθμός λέγεται άψογο τετράγωνο (flawless square), όταν είναι τέλειο τετράγωνο και ταυτόχρονα ισούται με το τετράγωνο του αθροίσματος διαδοχικών ψηφίων του. Τονίζουμε ότι όλα τα ψηφία πρέπει να χρησιμοποιηθούν. Για παράδειγμα, ο αριθμός 1 είναι ένα άψογο τετράγωνο καθώς είναι το τετράγωνο ενός αριθμού (1) και ταυτόχρονα το άθροισμα των ψηφίων του στο τετράγωνο (1²) ισούται με τον αρχικό αριθμό. Αντίστοιχα, ο αριθμός 81 είναι ένα άψογο τετράγωνο, καθώς είναι τέλειο (9²) και ταυτόχρονα το άθροισμα των ψηφίων του στο τετράγωνο ισούται με τον αρχικό αριθμό ((8 + 1)² = 81). Παρακάτω παραθέτουμε μερικά ακόμα παραδείγματα άψογων αριθμών:
1296 = (1 + 29 + 6)^2 = 36^2
3025 = (30 + 25)^2 = 55^2
8281 = (8 + 2 + 81)^2 = (82 + 8 + 1)^2 = 91^2
998001 = (998 + 0 + 0 + 1)^2 = 999^2
4941729 = (494 + 1729)^2 = 2223^2
Για το ζητούμενο αυτής της άσκησης, καλείστε να γράψετε ένα πρόγραμμα το οποίο να υπολογίζει το άθροισμα όλων των άψογων τετραγώνων που βρίσκονται σε ένα εύρος φυσικών αριθμών.
Τεχνικές Προδιαγραφές
progintro/hw1-<YourUsername>flawless/src/flawless.c./flawless low high, με το πρώτο (low) να είναι το κάτω όριο και το δεύτερο να
είναι το άνω όριο (high). Τα δύο όρια είναι κλειστά, δηλαδή η αναζήτηση πρέπει να
γίνει στο σύνολο [low, high]. Για οποιαδήποτε είσοδο δεν είναι μέσα στις
προδιαγραφές το πρόγραμμα πρέπει να επιστρέφει με κωδικό εξόδου (exit code) 1. Εάν
δοθεί άνω όριο χαμηλότερο του κάτω ορίου το πρόγραμμα πρέπει να τερματίσει με κωδικό
εξόδου 1.gcc -O3 -Wall -Wextra -Werror -pedantic -o flawless flawless.c -lmclang-format -i -style=Google flawless.c σε έναν υπολογιστή
εργαστηρίου. Μη μορφοποιημένα προγράμματα δεν θα εξεταστούν.flawless/README.mdflawless/test/inputflawless/test/outputΓια παράδειγμα, το περιεχόμενο του input αρχείου μπορεί να είναι: “1 100000” και του αντίστοιχου output: “184768”. Προσοχή: αυτό το παράδειγμα δεν θα γίνει δεκτό από την άσκηση επειδή αυτό το input-output ζευγάρι υπάρχει ήδη παρακάτω, επομένως πρέπει να διαλέξετε κάποιο άλλο.
main.Παρακάτω παραθέτουμε την αλληλεπίδραση με μια ενδεικτική λύση:
thanassis@linux14:~$ gcc -O3 -Wall -Wextra -Werror -pedantic -o flawless flawless.c -lm
thanassis@linux14:~$ ./flawless 1 1000
182
thanassis@linux14:~$ ./flawless 1 100000
184768
thanassis@linux14:~$ ./flawless 1 10000000
30940314
thanassis@linux14:~$ time ./flawless 1 10000000000
499984803178
real 0m0,204s
user 0m0,203s
sys 0m0,001s
Στο αρχείο README.md πρέπει να προσθέσετε οποιεσδήποτε παρατηρήσεις σας κατά την
διεκπεραίωση της άσκησης. Ο κώδικας απαιτείται να είναι καλά τεκμηριωμένος με σχόλια
καθώς αυτό θα είναι μέρος της βαθμολόγησης.
Διατρέξτε τις ρίζες k (από √low έως √high) αντί για όλους τους αριθμούς του εύρους,
και για κάθε k² ρωτήστε: «μπορώ να κόψω τα ψηφία του σε διαδοχικά κομμάτια με άθροισμα
k;». Αυτό γράφεται φυσικά αναδρομικά: αφαιρέστε ένα κομμάτι από το τέλος του αριθμού (με
% και / σε δύναμη του 10) και ρωτήστε το ίδιο για το υπόλοιπο με μικρότερο στόχο.
Κόψτε νωρίς τους κλάδους όπου το μερικό άθροισμα ήδη ξεπέρασε το k, και προσέξτε τα
ενδιάμεσα μηδενικά (π.χ. 998001).
Αριθμός στον οδηγό: Α11.20
(στο κεφάλαιο) ·
Μόνιμο αναγνωριστικό: hw-2023-hw1-flawless ·
Σύνδεσμος: https://progintro.github.io/study/questions/homework/hw-2023-hw1-flawless.html ·
Markdown (GitHub)