新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 如何利用C来实现勾股数公式? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4375 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何利用C来实现勾股数公式? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     葛靖青001 美女呀,离线,快来找我吧!水瓶座1984-2-14
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:168
      积分:595
      门派:XML.ORG.CN
      注册:2010/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给葛靖青001发送一个短消息 把葛靖青001加入好友 查看葛靖青001的个人资料 搜索葛靖青001在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给葛靖青001 引用回复这个贴子 回复这个贴子 查看葛靖青001的博客楼主
    发贴心情 如何利用C来实现勾股数公式?

    【转自互联网】

    话说已经三个月没碰过算法了,真的很无奈,恐怕学到的一点知识全忘光了。

      昨天,萝莉神给我一道题目:

      Roowe(没见过这么BT的,拿自己名字去编题目)很喜欢研究数学,现在他就遇到一个有趣的问题,比如,直角三角形的周长是120的话,那么它的三条边可以是20,48,52,或者24,45,51,还有30,40, 50,有三种不同的解,现在他想知道一个区间[a,b]中哪个数的解数最多(1<= a, b <= 1000000)?

      输入:

      10 100

      1000 100000

      1 1000000

      300000 700000

      100000 300000

      100000 700000

      800000 900000

      104 720720

      80 360360

      1 1000000

      输出:

      60 2

      55440 40

      720720 104

      360360 80

      240240 64

      360360 80

      831600 78

      720720 104

      360360 80

      720720 104

      让我做下,本来懒得做的,但是他说打表就OK了,于是我就欣然答应了。。。奈何他眼中的打表难易度和我眼中不一样,再次看到了数学系高材生和我的差距,嘿嘿。

      第一次尝试,失败。

      我说,不就是勾股定理a^2+b^2=c^2吗?结果他说,你再去补补数学知识。。。。

      于是给了我一个链接,我一看,不就是百度百科的勾股数吗,于是就暂时搁浅了。

      今晚第二次尝试,仍然失败。

      依稀记得昨天他给我说了有个什么勾股数公式,在百度百科那个勾股数的最下面介绍了,但是我看了半天,还是有点迷糊。

      然后让他把代码给我看看,好吧,结合百科介绍的勾股数公式,茅塞顿开。

      这里给出勾股数公式:

      直角三角形三条边a, b, c,其中a,b是直角边。

      则 a=2*m*n

      b=m^2-n^2

      c=m^2+n^2

      当然,这是有前提条件的,也就是其局限性:“勾股数的公式还是有局限的。勾股数公式可以得到所有的基本勾股数,但是不可能得到所有的派生勾股数。比如6,8,10;9,12,15…,就不能全部有公式计算出来”

      也就是说,3,4,5可以求出来,但是其倍数6,8,10就不行了。

      这里要注意几个问题:

      1.构成三角形的条件:

      2*m*n+m^2-n^2 > m^2+n^2

      既m>n

      2.a, b, c互质,即无法得到派生的勾股数。
    以下是代码:

      // Tanky Woo

      // www.WuTianQi.com

      #include <iostream>

      #define M 1000000

      int arr[M+1];

      using namespace std;

      int gcd(int a, int b)

      {

      if(b==0)

      return a;

      else

      return gcd(b, a%b);

      }

      void init()

      {

      for(int i=1; i<=800; ++i)

      for(int j=i+1; 2*j*j+2*j*i<=M; ++j)

      {

      int x, y, z;

      x=2*i*j;

      y=j*j-i*i;

      z=j*j+i*i;

      //确保x,y,z互质

      if(gcd(gcd(x, y), z) == 1)

      {

      int t = x+y+z;

      int tmp = 1;

      while(tmp*t <= M)

      {

      arr[tmp*t]++;

      ++tmp;

      }

      }

      }

      }

      int main()

      {

      //freopen("input.txt","r",stdin);

      //freopen("output.txt","w",stdout);

      init();

      int n, m;

      while(scanf("%d%d",&n,&m) != EOF){

      int pos = 0;

      int Max = 0;

      for(int i=n; i<=m; i++){

      if(arr[i] > Max){

      Max = arr[i];

      pos = i;

      }

      }

      printf("%d %d\n",pos, Max);

      }

      return 0;

      }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    ---人之所以能,是相信能!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/12/7 15:32:00
     
     GoogleAdSense水瓶座1984-2-14
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给Google AdSense 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/6 11:57:19

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms