免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liuke432
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2008-04-17 15:12 |只看该作者
原帖由 wxycyel 于 2008-4-17 15:02 发表
有两个意见
1 第一层循环中I的值不用到N,最大到N除以2的平方根(取整)就可以了,因为再大的话, I^2 + (I+1)^2就大于N了;
2 一个循环就可以, 可以在这次循环中对I^2+(I+1)^2的值,进行检查,如果值小于N并且是一个 ...


Thanks!
对于(2),I^2+(I+1)^2的值应该是小于N^2, 怎样判断这个数是平方数,还得用循环?

论坛徽章:
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
12 [报告]
发表于 2008-04-17 15:18 |只看该作者

回复 #11 liuke432 的帖子

可以不用循环,标准math库中应该有求平方根的函数(你最好查一下,我也不是很清楚),改造一下应该可以用的.
判断小于N是我对I的最后一个值等到的结果是否一定小于N没有把握,如果可以肯定小于的话可以不比较.

论坛徽章:
0
13 [报告]
发表于 2008-04-17 15:23 |只看该作者
原帖由 liuke432 于 2008-4-17 15:12 发表


Thanks!
对于(2),I^2+(I+1)^2的值应该是小于N^2, 怎样判断这个数是平方数,还得用循环?


  1.         if ((floor(sqrt(a)) * floor(sqrt(a))) == a)
  2.         {
  3.                 printf("yes\n");
  4.         }
  5.         else
  6.         {
  7.                 printf("no\n");
  8.         }
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2008-04-17 15:43 |只看该作者
个人怀疑,除了0^2+1^2=1^2
3^2+4^2=5^2
不存在别的b=a+1

论坛徽章:
0
15 [报告]
发表于 2008-04-17 15:52 |只看该作者
原帖由 cjaizss 于 2008-4-17 15:43 发表
个人怀疑,除了0^2+1^2=1^2
3^2+4^2=5^2
不存在别的b=a+1


还是有其它的.

如是:
a=3,b=4,c=5
a=20,b=21,c=29
a=119,b=120,c=169
a=696,b=697,c=985

论坛徽章:
0
16 [报告]
发表于 2008-04-17 15:53 |只看该作者
原帖由 cjaizss 于 2008-4-17 15:43 发表
个人怀疑,除了0^2+1^2=1^2
3^2+4^2=5^2
不存在别的b=a+1


还有,比如 20,21,29

论坛徽章:
0
17 [报告]
发表于 2008-04-17 16:04 |只看该作者
综合上面各位的提示,得到如下算法:


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



谢谢大家!

论坛徽章:
0
18 [报告]
发表于 2008-04-17 16:05 |只看该作者
原帖由 liuke432 于 2008-4-17 15:53 发表


还有,比如 20,21,29


刚刚写的, 不知道有错没得.


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>

  4. #define N 1000000000

  5. int main()
  6. {
  7.         int tmp = (int)sqrt(N);
  8.         int count = 0;

  9.         int a, c;

  10.         for (a = 0; a < tmp; a++)
  11.         {
  12.                 c = a*a + (a+1)*(a+1);
  13.                 if ((int)sqrt(c) > N)
  14.                         break;
  15.                 if ((floor(sqrt(c)) * floor(sqrt(c))) == c)
  16.                 {
  17.                         count++;
  18.                         printf("a=%d,b=%d,c=%d\n", a, a+1, (int)sqrt(c));
  19.                 }
  20.         }
  21.         printf("done\n");
  22.         return 0;
  23. }

复制代码



结果:
a=0,b=1,c=1
a=3,b=4,c=5
a=20,b=21,c=29
a=119,b=120,c=169
a=696,b=697,c=985
a=4059,b=4060,c=5741
a=23660,b=23661,c=33461
done

real    0m0.015s
user    0m0.016s
sys     0m0.000s

[ 本帖最后由 scutan 于 2008-4-17 16:07 编辑 ]

论坛徽章:
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
19 [报告]
发表于 2008-04-17 16:18 |只看该作者

回复 #18 scutan 的帖子

tmp的值取得有问题,应该是 N/sqrt(2);

论坛徽章:
0
20 [报告]
发表于 2008-04-17 16:23 |只看该作者
大家应该探讨有没有低于O(n)的算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP