[C++] Rozkład liczby na sumy kwadratów

strefa61
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 12 gru 2013, o 22:22
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 77 razy

[C++] Rozkład liczby na sumy kwadratów

Post autor: strefa61 »

Programuję w c++. Za pomocą funkcji (najlepiej bez rekurencji) oraz pętli (for, while) i if-ów, czyli podstaw podstaw mam wykonać zadanie (te ograniczenia wynikają z tego, że zadanie jest w książce prawie na samym początku, gdy jeszcze nawet tablice nie są przerobione): Funkcja ma rozłożyć dowolną liczbę naturalną n i wypisać wszystkie możliwe liczby naturalne, których kwadraty zesumowane dadzą liczbę n.
Dla sumy dwóch kwadratów sprawa jest prosta, bo wystarczą dwie pętle "for":

Kod: Zaznacz cały

void rozklad (long double n){
for (long double i = 0; i<=n; i++){
    for (long double p = i; p<=n; p++){
        int s = i*i + p*p;
        if (s==n){
            cout << i << " oraz " << p << '\n';
        }
    }
}
,
ale nie mam pojęcia jak zrobić, żeby te pętle wykonywały się na przykład n-razy dla [1^2] (bo sumy tego kwadratu zawsze dadzą n) oraz, żeby wykonywały się inną ilość razy dla innych szukanych kombinacji liczb.
Ostatnio zmieniony 31 sie 2017, o 07:57 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Takahashi
Użytkownik
Użytkownik
Posty: 186
Rejestracja: 12 maja 2017, o 19:04
Płeć: Mężczyzna
Lokalizacja: brak
Podziękował: 1 raz
Pomógł: 22 razy

[C++] Rozkład liczby na sumy kwadratów

Post autor: Takahashi »

Bez rekurencji rozwiązanie tego zadania będzie skrajnie nieczytelne. Z rekurencją jest bardzo prosto. W Haskellu to trzy linijki

Kod: Zaznacz cały

import Data.List
squares n = takeWhile (<= n) $ map (^2) [1..]
sums 1 = [[1]]
sums n = nub $ map sort [x:xs | x <- squares n, xs <- sums (n-x)]

-- sums 10 zwraca wynik:
-- [[1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,4],[1,1,4,4],[1,9]]
ODPOWIEDZ