问题:
四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。
如果把
包括进去,就正好可以表示为四个数的平方和。
比如:
则对于一个给定的正整数
,可以表示为:
。
你需要求出 字典序 最小的一组解
。
字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。
输入格式:
程序输入为一个正整数
。
输出格式:
输出四个非负整数
,中间用空格分开。
样例输入:
5
样例输出
0 0 1 2
样例输入:
12
样例输出:
0 2 2 2
题解:
解法一:
思路:用四层for循环,从0开始,当找到第一个就输出(但测试超时)
#include<iostream>
#include<math.h>
using namespace std;
int main(void)
{
int n;
cout << "请输入一个数字(1-5000000):";
cin >> n;
for (int i = 0; i < sqrt(n); i++)
{
for (int j = 0; j < sqrt(n); j++)
{
for (int x = 0; x < sqrt(n); x++)
{
for (int y = 0; y < sqrt(n); y++)
if ((i*i + j * j + x * x + y * y) == n)
{
cout << i << " " << j << " " << x << " " << y;
system("pause");
return 0;
}
}
}
}
system("pause");
return 0;
}
解法二:
思路:可以只遍历三个数,最后一个数用 n 减去前三个数的平方和再开根号得到,判断条件是,开出的根号正好是个整数
#include<iostream>
#include<math.h>
using namespace std;
int main(void)
{
int n;
cout << "请输入一个数字(1-5000000):";
cin >> n;
for (int i = 0; i < sqrt(n); i++)
{
for (int j = 0; j < sqrt(n); j++)
{
for (int k = 0; k < sqrt(n); k++)
{
if (sqrt(n - (i*i + j * j + k * k)) == int(sqrt(n - (i*i + j * j + k * k))))
{
cout << i << " " << j << " " << k << " " << int(sqrt(n - (i*i + j * j + k * k)));
system("pause");
return 0;
}
}
}
}
system("pause");
return 0;
}