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

int sq(int x) {
	return x*x;
}

int getmaxsq(int value) {
	int max_square = 0;

	for (int i = 0; i <= value; i++) {
		if ( value - sq(i) >= 0) max_square = i;
		else break;
	}

	return max_square;
}

void printr(int value, int v1, int v2, int v3, int v4) {
	printf("%d = %d + %d + %d + %d\n", value, sq(v1), sq(v2), sq(v3), sq(v4));
}

int main(int argc, char * argv[]) {
	int value;

	printf("Veuillez donner un entier naturel : ");
	scanf("%d", &value);

	int ms1 = getmaxsq(value);
	for (int i1 = ms1; i1 > 0 && sq(i1)*4 >= value && value - sq(i1) < sq(i1+1); i1--) {
		int val1 = value - sq(i1);

		if (val1 == 0) printr(value, i1, 0, 0, 0);
		else {
			int ms2 = getmaxsq(val1);
			for (int i2 = ms2; i2 > 0 && sq(i2)*4 >= val1 && val1 - sq(i2) < sq(i2+1); i2--) {
				int val2 = val1 - sq(i2);

				if (val2 == 0) printr(value, i1, i2, 0, 0);
				else {
					int ms3 = getmaxsq(val2);
					for (int i3 = ms3; i3 > 0 && sq(i3)*4 >= val2 && val2 - sq(i3) < sq(i3+1); i3--) {
						int val3 = val2 - sq(i3);

						if (val3 == 0) printr(value, i1, i2, i3, 0);
						else {
							int ms4 = getmaxsq(val3);
							for (int i4 = ms4; i4 > 0 && sq(i4)*4 >= val3 && val3 - sq(i4) < sq(i4+1); i4--) {
								int val4 = val3 - sq(i4);

								if (val4 == 0) printr(value, i1, i2, i3, i4);
							}
						}
					}
				}
			}
		}
	}
	
	return EXIT_SUCCESS;
}

