Funkcja wypisująca wszystkie możliwe rozkłady liczby n

0

Witam.
Potrzebowałbym aby ktoś mi wytłumaczył jak napisać kod bądź powiedział co w moim trzeba by przerobić.

Zadanie jest następujące:

Napisz funkcję, która dostaje jako argument dodatnią liczbę całkowitą n i wypisuje na standardowym wyjściu wszystkie możliwe rozkłady liczby n na sumy kwadratów dodatnich liczb całkowitych.

Poprzednie zadanie brzmiało podobnie lecz było ograniczenie tylko do rozkładu na dwie liczby tj. a^2^ + b^2^ = n.
Ten problem było prościej rozwiązać a mój kod wyglądał następująco:

int suma_kwadrat(int n)
{
       int a,b;
    for(a=0;a<=n;a++)
    {
        for(b=a;b<=n;b++)
        {
            if((a*a)+(b*b)==n)
            {
                printf("%d^2 + %d^2 = %d\n",a,b,n);
            }
        }
    }
}

Lecz w tym zadaniu trudniejszym jest o tyle trudniej że nie ma ograniczenia co do ilości kwadratów które należy sumować.

0

Masz ograniczenie, ograniczeniem jest maksymalny rozkład zadanej liczby
np. dla n=8 ten rozkład to 3. Bo więcej się nie da.

2
#include <stdio.h>
#include <stdlib.h>

void
rozklad(int n, int *vals, int pos)
{
	int ii, jj;

	if (n == 0) {
		for (jj = 0; jj < pos; jj++) {
			printf("%d^2 + ", vals[jj]);
		}
		printf("\n");
	} else {
		for (ii = pos > 0 ? vals[pos - 1] : 1; ii * ii <= n; ii++) {
			vals[pos++] = ii;
			rozklad(n - ii * ii, vals, pos);
			vals[--pos] = 0;
		}
	}
}

int
main()
{
	int n, *vals;

	n = 1000;
	vals = (int *)calloc(sizeof(*vals), n + 1);
	rozklad(n, vals, 0);
	free(vals);
}

Lecz w tym zadaniu trudniejszym jest o tyle trudniej że nie ma ograniczenia co do ilości kwadratów które należy sumować.

Oczywiście że jest. Znamy zarówno dolne jak i górne ograniczenie Min = 1 (sqrt(n)), max = n (suma n kwadratów jedynek).

0

Kurcze w ten sposób nie pomyślałem :D Ale bardzo fajnie wytłumaczone :D
Dzięki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1