第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。比如:5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思)对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
[需求分析]
1.输入的形式
一个正整数N。
2.输入值的范围
N小于5000000.
3.输出形式
4个非负整数,按从小到大排序,中间用空格分开
4.程序所能达到的功能
计算正整数N可以由哪4个数字的平方相加,并从小到大在一行输出,中间用空格分开。
5.测试数据
输入5555,输出0 1 15 73。
[概要分析]
在头文件上添加数学公式,直接在主调函数里面判断与计算。从键盘里输入正整数N,定义一个double类型的变量Max和d,整型变量a,b,c,令Max等于N的开平方根,用三个for循环计算,最里面的for循环将初始化都为0的整型变量a,b,c的平方与N的差的开平方根赋值给double 型变量d,在用if语句判断d是否为整数,若为整数则输出a,b,c,d,并条出循环,结束计算,若d不是整数,则继续循环,直到找到符合条件的4个数为止,当然是在合适的范围里面找4个数。
[完整程序]
#include <stdio.h>
#include <math.h>
int main()
{
int a, b, c, n, flag = 0;
double maxN, d;
printf("输入一个正整数为:");
scanf("%d", &n);
maxN = sqrt(n); //开平方根
for(a = 0; a <= maxN; a ++)
{
for(b = a; b <= maxN; b ++)
{
for(c = b; c <= maxN; c ++)
{
d = sqrt(n - a*a - b*b - c*c);
if(d == (int)d)
{
printf("%d %d %d %d\n", a, b, c, (int)d);
flag = 1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
return 0;
}
[调试分析]
调试的值不能太大,否则容易死机,每次调试只能输入一组数据。
[使用说明]
运行环境VC6.0
[测试结果]