计蒜客:四平方和

问题:

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多四个正整数的平方和。
如果把 0 0 包括进去,就正好可以表示为四个数的平方和。
比如:
5 = 0 2 + 0 2 + 1 2 + 2 2 \displaystyle 5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1 2 + 1 2 + 1 2 + 2 2 \displaystyle 7 = 1^2 + 1^2 + 1^2 + 2^2
则对于一个给定的正整数 n n ,可以表示为: n = a 2 + b 2 + c 2 + d 2 n = a^2 + b^2 + c^2 + d^2
你需要求出 字典序 最小的一组解 a , b , c , d a,b,c,d
字典序大小:从左到右依次比较,如果相同则比较下一项,直到有一项不同,较小的一方字典序更小,反之字典序更大,所有项均相同则二者字典序相同。

输入格式:
程序输入为一个正整数 N ( 1 N 5000000 ) N(1 \leq N \leq 5000000)

输出格式:
输出四个非负整数 a , b , c , d a,b,c,d ,中间用空格分开。

样例输入:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41918107/article/details/86375428