• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program na wypisywanie liczby jako dowolna suma kwadratów

VPS Starter Arubacloud
0 głosów
1,457 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez Albert Holly Nowicjusz (140 p.)

Utowrzyłem program na wyszukiwanie liczby w postaci sumy kwadratów dwóch liczb, jednak nie wiem jak zrobić by program zwracał każdą możliwą sumę kwadratów z każdej możliwej liczby, która podniesiona do kwadratu jest mniejsza od n i dodanie poprzednich kwadratów tak, żeby otrzymać n. Myślałem nad utworzeniem dynamicznej tablicy, w której będą wszystkie dzielniki danej liczby. Nie wiem jednak jak powielać te liczby, aby otrzymać każdą możliwą kombinację. Poniżej przestawiam program wyświetlający liczbę jako sumę kwadratów dwóch liczb mniejszych od n. 

Przykładowo dla 50 :

Zacząć od 50 x 1 do 2, 
Kończyć na 7do 2 + 1 do 2

#include <iostream>

using namespace std;
int rozklad(int n)
{
    int a=0, b=0;

    for(int i=n; i>0; i--)
    {

        for(int j=n; j>i; j--)
        {

         if((i*i)+(j*j)==n)
         {

         cout<<"liczba"<<n<<"to podniesione do kwadratu liczby"<<i<<","<<j<<endl;

         }



        }
        for (int k=n; k>0; k--)
        {
        if((i==k) && ((i*i)+(k*k)==n))
        cout <<"Istnieje takze rozklad, w ktorym"
                "liczby sa takie same"<<k<<","<<i<<endl;
        }
    }
    return n;
}
 int powtarzalnosc(int m)
 {

 }

int main()
{
    int liczba;
    cout << "Podaj liczbe"
            ", ktora ma zostac rozlozona" << endl;
    cin >>liczba;
    cout <<"Rozdklad wynosi"<<rozklad(liczba)<<endl;
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 11 stycznia 2018 przez k222 Nałogowiec (30,150 p.)

Co do twojego programu:

- w 6 linijce masz zadeklarowane dwie nieużywane zmienne;

- te warunki w pętli które masz:

for(int i = n; i > 0; i--)
for(int j = n; j > i; j--)

i w ten sposób i lata od n do 1 oraz j on n do i, myślę ze taki zapis zmniejszył by troszkę ilość operacji:

for(int i = 0; i * i <= n; i++)
for(int j = i;  j * j < n; j++)

- w if'ie (w 18 linijce) możesz wstawić break, bo jak znajdzie jedną liczbę to po co ma szukać dalej,

- ten drugi for (ten z k) jest bez sensu - moje pętle to uwzględniają więc wystarczy jeden if jak badzo chcesz to mieć wyróżnione - najlepiej przed lub po pętlach, żeby oddzielnie sprawdziło bo to jest proste sprawdzenie które spełnia jedna liczba po co je robić tysiąc razy,

- nie rozumiem po co ta funkcja zwraca n, ale to już inna sprawa (według mnie taka funkcja miała by sens gdyby była void lub zwracała te liczby),

- generalnie mógłbyś to ładniej napisać - łatwiej by się czytało wink

Co do twojego pytania to można to zrobić na kilka sposobów - ten trudny ale krótki to rekurencja - od liczby odejmujesz kwadrat i rozkładasz to co zostało i jak dojdziesz do zera to wypisujesz - możesz rozkminić, inny jest taki (będziesz potrzebował sprawdzać czy liczba jest kwardatem) - masz pętlę for(int i = 1; ...) i odejmujesz od liczby n i*i tak długo aż dojdziesz do n <=0  jeżeli n = 0 to wyświetlasz - jednocześnie sprawdzasz czy ta reszta jest kwadratem liczby całkowitej, jeżeli tak wyświetlasz i tak aż do momentu gdy i*i > n - algorytm jest

komentarz 11 stycznia 2018 przez Albert Holly Nowicjusz (140 p.)
Tam gdzie jest ta pętla w pętli miałem wykluczyć i!=j żeby nie mieć dwa razy tego samego rozkładu tylko z innymi miejscami, to jednak uniemożliwiło mi wypisanie rozkładu w którym dwei takie same liczby podniesione do kwadratu dawały n.

Podobne pytania

+1 głos
4 odpowiedzi 3,527 wizyt
pytanie zadane 24 września 2015 w C i C++ przez LogicznyMat Użytkownik (940 p.)
+1 głos
2 odpowiedzi 390 wizyt
pytanie zadane 25 października 2021 w C i C++ przez krukWiesio Początkujący (400 p.)
0 głosów
1 odpowiedź 101 wizyt
pytanie zadane 9 maja 2017 w C i C++ przez kawainka Początkujący (380 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...