拉格朗日算法分析和源代码

第四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多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类型的变量Maxd,整型变量a,b,c,令Max等于N的开平方根,用三个for循环计算,最里面的for循环将初始化都为0的整型变量a,b,c的平方与N的差的开平方根赋值给double 型变量d,在用if语句判断d是否为整数,若为整数则输出a,b,c,d,并条出循环,结束计算,若d不是整数,则继续循环,直到找到符合条件的4个数为止,当然是在合适的范围里面找4个数。

 

[完整程序]

#include  

#include  

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

[测试结果]

拉格朗日算法分析和源代码_第1张图片

你可能感兴趣的:(日记博客)