免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 12623 | 回复: 42
打印 上一主题 下一主题

[C] 一道算法题,求最优解法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-17 13:35 |只看该作者 |倒序浏览
2可用积分
有一种数组(a,b,c),满足条件: a*a+b*b=c*c和b=a+1。例如(3,4,5)。
用程序找出指定范围(1<a,b,c<N)内所有的这种数组,求最优算法。

1.普通的解法: 群举法


  1.    for(i=2,i<N,i++)
  2.        for(j=2,j<N,j++)
  3.            for(k=2,k<N,k++)
  4.              if((i*i+j*j==k*k)&&(j==i+1))
  5.                  printf("%d,%d,%d\n",i,j,k);
复制代码

                 
2.优化一下,去掉一层for循环

  1.    for(i=2,i<N,i++)
  2.        for(k=i+1,k<N,k++)
  3.              if(i*i+(i+1)*(i+1)==k*k)
  4.                  printf("%d,%d,%d\n",i,i+1,k);
复制代码

                 
请问还有没有其它更优化的算法?  

[ 本帖最后由 liuke432 于 2008-4-17 13:36 编辑 ]

最佳答案

查看完整内容

还可以再去掉一层循环,知道a的值了,就知道c的值和b的值了,判断一下b和c是不是在范围内就行了。

论坛徽章:
0
2 [报告]
发表于 2008-04-17 13:35 |只看该作者
还可以再去掉一层循环,知道a的值了,就知道c的值和b的值了,判断一下b和c是不是在范围内就行了。

论坛徽章:
0
3 [报告]
发表于 2008-04-17 13:51 |只看该作者
c 也是整数?

论坛徽章:
0
4 [报告]
发表于 2008-04-17 14:23 |只看该作者
貌似LZ的第二种方法就可以了,如果单纯以循环判断优劣,可以用cugb_cat 斑竹的方法,但是同时也增加了很多运算和比较...

论坛徽章:
0
5 [报告]
发表于 2008-04-17 14:26 |只看该作者
原帖由 cugb_cat 于 2008-4-17 13:44 发表
还可以再去掉一层循环,知道a的值了,就知道c的值和b的值了,判断一下b和c是不是在范围内就行了。


写成程序是什么样的呢?c用a怎么表示呢,带根号的?   :)

论坛徽章:
0
6 [报告]
发表于 2008-04-17 14:27 |只看该作者
原帖由 LinuxKen 于 2008-4-17 13:51 发表
c 也是整数?


a,b,c 都是整数

论坛徽章:
0
7 [报告]
发表于 2008-04-17 14:27 |只看该作者
符合勾股定理的数貌似不是很多,数论书上有介绍这个的,推荐陈景润的初等数论,上面有比较详细的讨论勾股数的内容,我感觉通过一些公式和定理,可以减少很多计算。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2008-04-17 14:47 |只看该作者
b^2-a^2=(b+a)(b-a)=a+b
只要a+b为平方数即可

论坛徽章:
0
9 [报告]
发表于 2008-04-17 14:59 |只看该作者
原帖由 cjaizss 于 2008-4-17 14:47 发表
b^2-a^2=(b+a)(b-a)=a+b
只要a+b为平方数即可


但这里是b=a+1, 是b和a有这样的关系。
如果是c和a有这样的关系,这个等式倒可以用。

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
10 [报告]
发表于 2008-04-17 15:02 |只看该作者
有两个意见
1 第一层循环中I的值不用到N,最大到N除以2的平方根(取整)就可以了,因为再大的话, I^2 + (I+1)^2就大于N^2了;
2 一个循环就可以, 可以在这次循环中对I^2+(I+1)^2的值,进行检查,如果值小于N并且是一个整数的平方数就输出I

[ 本帖最后由 wxycyel 于 2008-4-17 16:18 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP