august 发表于 2009-4-10 16:44:43

问个弱弱的算法问题...

题目是求证任何一个自然数都可由4个数的平方和来表示
程序如下:


#include<stdio.h>
#include<stdlib.h>

void check(int);

int main(void)
{
    int n;
   
   
    scanf("%d",&n);
    check(n);
   
    getch();
    return 0;
}
void check(int i)
{
    int aa;
    int t;
   
    t = i;
    for(aa=sqrt(t);aa>=sqrt(t/2);aa--)
    {
      t -= aa * aa;
      for(aa=sqrt(t);aa>=sqrt(t)/2;aa--)
      {
            t -= aa * aa;
            for(aa=sqrt(t);aa>=sqrt(t)/2;aa++)
            {
                t -= aa * aa;
                for(aa=sqrt(t);aa>=sqrt(t)/2;aa++)
                  if(aa*aa+aa*aa+aa*aa+aa*aa==i)
                  {
                        printf("%5d %5d %5d %5d",aa,aa,aa,aa);
                        getch();
                        exit(0);
                  }
            }
      }
    }
    printf("无解 !\n");
    getch();
}



问题:
1)为什么它循环的最大值为什么可以写成 被判断数的一半再开方(sqrt(t/2))
2) 为什么下面又变成了 (sqrt(t)/2)
3) 为什么上两循环都是 --, 而最后两个循环用++呢?

麻烦大大们解释一下。谢谢了

shawind 发表于 2009-4-10 18:41:02

这个算法,数学问题大于程序问题吧。
我数学不及格。

august 发表于 2009-4-11 14:32:32

现在大概理解了,比如用5来分解的话可以分成 5=2^2 + 1^2 + 0^2 + 0^2,所以其实最大值只需要取到,sqrt(5/2)就够了,像五的话,它最大的值只能取到2。但是最后两个循环,我觉得应该改为-- 才对,要不好像会造成死循环。
说了这么多其实不知是不是这样。。。

yelengye 发表于 2009-7-1 13:22:06

好恐怖的时间复杂度……
页: [1]
查看完整版本: 问个弱弱的算法问题...