# Thread: Mathematics - Lagranges statement

1. ## Mathematics - Lagranges statement

I want to make a program that showes "Lagranges - statement":
Every even number can be made up by at least one combination
of four or less square numbers.

In the program you shall enter a specific, even number (haven't added that to the code yet). Then the program shall test all the possible combinations with 1,2,3 or 4 square numbers in (will be alot of them), and then subtract them with the specific number.
If it returns 0, then the combinations that went out should be outputted to the screen. (The screen outputs which I've used now is just for seeing if it works).

This is what I've got:

#include <iostream.h>
#include <stdlib.h>

int main()
{

int i;
int x;

int a;
int b;
int c;
int d;
int e;
int f;

for (i=0; i<=6; i++)
{
if(i==1){a=i*i;}
if(i==2){b=i*i;}
if(i==3){c=i*i;}
if(i==4){d=i*i;}
if(i==5){e=i*i;}
if(i==6){f=i*i;}
}

std::cout << a << " ";

for (i=0; i<=6; i++)
{
if (i==1)
{std::cout << a*2 << a*3 << a*4 << a*5 << a*6 << "\n";}

if (i==2)
{std::cout << a+(b*1) << a+(b*2) << a+(b*3) << a+(b*4) << a+(b*5) << a+(b*6) << "\n";}

if (i==3)
{std::cout << a+(c*1) << a+(c*2) << a+(c*3) << a+ (c*4) << a+(c*5) << a+(c*6) << "\n";}

if (i==4)
{std::cout << a+(d*1) << a+(d*2) << a+(d*3) << a+(d*4) << a+(d*5) << a+(d*6) << "\n";}

if (i==5)
{std::cout << a+(e*1) << a+(e*2) << a+(e*3) << a+(e*4) << a+(e*5) << a+(e*6) << "\n";}

if (i==6)
{std::cout << a+(f*1) << a+(f*2) << a+(f*3) << a+(f*4) << a+(f*5) << a+(f*6) << "\n";}

system("PAUSE");

return 0;
}

2. (To keep the combinations down you can make the program not to use numbers greater than the specific number and not smaller than the number divided by 4)

3. int lagranges(int num /* in */, int rtn[4] /* out */)
{
int x, y, z;

if(num < 0) return -1;

//initialize rtn array
for(x = 0; x < 4; x++) rtn[x] = 0;

x = 0;

while(num)
{
for(y = num; num > 0 && x < 4; y--)
{
z = (int)sqrt(y);
if(z * z == y)
{
rtn[x] = z;
x++;
num -= y;
y = num + 1;
}
}
if(x == 4) break;
}

return num;
}

4. thanx man! U really good.

Although, please complete the whole program for me. I just can't call that function.

thanx al0t!

5. Although, please complete the whole program for me. I just can't call that function.
I got the bulk of the logic done, so you should be EASY for anyone to implement it in a program.

6. Ok, you're right. Shouldn't be letting everyone else make your programs, otherwise, you'll never learn.

7. I tried the function but it doesn't seem to work. Can you help me?

8. I edited the algorithm I posted before and added one line to it.
It works for most cases, but will need to be modified to work for every case.

9. Thanks. That thing I posted before about keeping combinations down by only using square numbers not smaller than the specific number divided by 4 isn't right. What is right is that at least one square number has to be bigger than the specific number divided by 4.

I have no idea about how fast computers can compute all the combinations (depends of Mhz of course), but here's a table of the first 50 square numbers:

<script language="JavaScript">

for (x=0; x<=50; x++)
{
document.write("<table border=1><td>"+x+"</td><td>"+x*x+"</td></table>");
}
</script>

Just so you know how many there are.

10. Please, anyone, I really want to complete this program! Just help me because I'm not that good at the programming part.

11. Code:
```#include <iostream.h>
#include <stdlib.h>

int main()
{
int integer, integer_sqrt;
bool disabled;

std::cout << "Eneter an integer: ";
std::cin >> integer;
std::cout << "\n--------------------------------------------------------------------------------Possible addings:\n--------------------------------------------------------------------------------\n";

integer_sqrt = sqrt(integer);
int Sqrt_numbers[integer_sqrt];

for(int i=0; i<=integer_sqrt; i++)
{
Sqrt_numbers[i] = i*i; Sqrt_numbers[i] == !disabled;
}

for(int x=1; x<=sizeof Sqrt_numbers/4; x++)
{

for(int y=1; y<=sizeof Sqrt_numbers/4; y++)
{

if(Sqrt_numbers[x]+Sqrt_numbers[y] == integer)
{std::cout << Sqrt_numbers[x] << " + " << Sqrt_numbers[y] << "\n";}

for(int z=1; z<=sizeof Sqrt_numbers/4; z++)
{

if(Sqrt_numbers[x]+Sqrt_numbers[y]+Sqrt_numbers[z] == integer)
{std::cout << Sqrt_numbers[x] << " + " << Sqrt_numbers[y] << " + " << Sqrt_numbers[z] << "\n";}

for(int i=1; i<=sizeof Sqrt_numbers/4; i++)
{

if(Sqrt_numbers[x]+Sqrt_numbers[y]+Sqrt_numbers[z]+Sqrt_numbers[i] == integer)
{std::cout << Sqrt_numbers[x] << " + " << Sqrt_numbers[y] << " + " << Sqrt_numbers[z] << " + " << Sqrt_numbers[i] << "\n";}

}

}

}

}

system("PAUSE");
return 0;
}```
Lagranges statement: if we disregard 1, all integers can be summarized by two, three or four
sqaure numbers. You will never have to use five or six.

Well, I decided to give this another try, now that I feel more experiened regarding C++.
There is now only one major issue left, which I have unsuccesfully tried to solve myself:

The program writes all of the possible summerizes for the integer, it's just that I sometimes
get the combinations more than one time. Example: type in "9" in the program, and the possible
summerizes of "1+4+4, 4+1+4, 4+4+1" will be displayed.

This is because the program adds the first number and on in the array, with the rest of the
numbers in the array. For example, the array looks like this: "1, 4, 9", then the program
will add "1+1, 1+4, 1+9, 4+1, 4+4, 4+9, 9+1, 9+4, 9+9". Each time the combination equals
the specific number, the combination is displayed. If the specific number is "5", it would
have been equaled by both 1+4 and 4+1, and thus displayed.

I have tried using a boolean value, to disable the specific combination. Like:

if(Sqrt_numbers[x]+Sqrt_numbers[y] == integer && Sqrt_numbers[x]+Sqrt_numbers[y] == !disabled)
{std::cout << Sqrt_numbers[x]+Sqrt_numbers[y]; Sqrt_numbers[x]+Sqrt_numbers[y] == disabled;}

In the loop where the array is initialized, I have also tried to give all of the numbers in it
the value of !disabled, as any number except 0 would get the value of true, and thus disabled.

Anyway, my purpose with this is that the current combination, for example: x=1 and y=4, are
together disabled, so that they won't be displayed again when x=4 and y=1. Unfortunately, this
doesn't work.

Any ideas?

12. Here's the program, compiled and zipped, as well. It's sad you can't upload something, once you've posted, when you want to edit later.

13. Please, how can I make combinations of numbers not to appear more than once?

Popular pages Recent additions