幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2695|回复: 3

[通用编程] 问个弱弱的算法问题...

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2009-4-10 16:44:43 | 显示全部楼层 |阅读模式
题目是求证任何一个自然数都可由4个数的平方和来表示
程序如下:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void check(int);
  4. int main(void)
  5. {
  6.     int n;
  7.    
  8.    
  9.     scanf("%d",&n);
  10.     check(n);
  11.    
  12.     getch();
  13.     return 0;
  14. }
  15. void check(int i)
  16. {
  17.     int aa[4];
  18.     int t;
  19.    
  20.     t = i;
  21.     for(aa[0]=sqrt(t);aa[0]>=sqrt(t/2);aa[0]--)
  22.     {
  23.         t -= aa[0] * aa[0];
  24.         for(aa[1]=sqrt(t);aa[1]>=sqrt(t)/2;aa[1]--)
  25.         {
  26.             t -= aa[1] * aa[1];
  27.             for(aa[2]=sqrt(t);aa[2]>=sqrt(t)/2;aa[2]++)
  28.             {
  29.                 t -= aa[2] * aa[2];
  30.                 for(aa[3]=sqrt(t);aa[3]>=sqrt(t)/2;aa[3]++)
  31.                     if(aa[0]*aa[0]+aa[1]*aa[1]+aa[2]*aa[2]+aa[3]*aa[3]==i)
  32.                     {
  33.                         printf("%5d %5d %5d %5d",aa[0],aa[1],aa[2],aa[3]);
  34.                         getch();
  35.                         exit(0);
  36.                     }
  37.             }
  38.         }
  39.     }
  40.     printf("无解 !\n");
  41.     getch();
  42. }
复制代码
问题:
1)为什么它循环的最大值为什么可以写成 被判断数的一半再开方(sqrt(t/2))
2) 为什么下面又变成了 (sqrt(t)/2)
3) 为什么上两循环都是 --, 而最后两个循环用++呢?

麻烦大大们解释一下。谢谢了
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2009-4-10 18:41:02 | 显示全部楼层
这个算法,数学问题大于程序问题吧。
我数学不及格。
え~え~お!!!
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
 楼主| 发表于 2009-4-11 14:32:32 | 显示全部楼层
现在大概理解了,比如用5来分解的话可以分成 5=2^2 + 1^2 + 0^2 + 0^2,所以其实最大值只需要取到,sqrt(5/2)就够了,像五的话,它最大的值只能取到2。但是最后两个循环,我觉得应该改为-- 才对,要不好像会造成死循环。
说了这么多其实不知是不是这样。。。
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

2

主题

13

帖子

116

积分

③业余

积分
116
发表于 2009-7-1 13:22:06 | 显示全部楼层
好恐怖的时间复杂度……
以HLSL的名义宣誓! 我会坚持到底!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-20 19:15 , Processed in 0.019764 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表