鱼C论坛

 找回密码
 立即注册
楼主: 欧拉计划

题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}

[复制链接]
发表于 2017-3-2 12:14:53 | 显示全部楼层
  1. for c in range(1,500):
  2.     for a in range(1,(1000-c)//2):
  3.         b=1000-a-c
  4.         if a**2+b**2==c**2:
  5.             print(a*b*c,a,b,c)
  6.             exit()
复制代码

  1. == RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\test.py ==
  2. 31875000 200 375 425
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 17:23:07 | 显示全部楼层
  1. import time
  2. start = time.clock()
  3. f=0
  4. for a in range(0,500):
  5.     for b in range(a,500):
  6.         c=1000-a-b
  7.         if(a**2+b**2)==c**2:
  8.             print('a=%d b=%d c=%d' %(a,b,c))
  9.             f=1
  10.             break
  11.     if f:break
  12. end = time.clock()
  13. print("read:%f s" %(end - start))
复制代码

>>>
a=200 b=375 c=425
read:0.149239 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 15:53:24 | 显示全部楼层
本帖最后由 JonTargaryen 于 2017-3-28 16:03 编辑

200 375 425
三角形两边之和大于第三边,所以不可能有任何一个边超过周长的一半。不需要遍历到1000,只要到500就可以了


  1. #include <stdio.h>

  2. #define NUM 1000

  3. int main(void)
  4. {
  5.     int a, b, c;

  6.     for(a = 1; a < NUM / 2; a++)
  7.     {
  8.         for(b = a; b < NUM / 2; b++)
  9.         {
  10.             c = NUM - a - b;

  11.             if(c * c == a * a + b * b)
  12.             {
  13.                 printf("%d %d %d\n", a, b, c);

  14.                 return 0
  15.             }
  16.         }
  17.     }

  18.     return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 15:57:56 | 显示全部楼层

  1. def main():
  2.     for a in range(500):
  3.         for b in range(a, 500):
  4.             c = 1000 - a - b

  5.             if a * a + b * b == c * c:
  6.                 print(a, b, c)
  7.                 return

  8. if __name__ == "__main__":
  9.     main()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 22:56:46 | 显示全部楼层
结果:
a=200, b=375, c=425, a*b*c=31875000
代码如下:
  1. print([(a,(1000-a-c),c,a*(1000-a-c)*c) for c in range(333,500) for a in range(0,333) if a**2+(1000-a-c)**2==c**2])
复制代码


思路大概是先计算了下a,b,c的大致取值范围,然后在这些范围内进行遍历,当符合a+b+c=1000和a2+b2=c2时便是找到了对应值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 22:59:00 | 显示全部楼层

卧槽,这是汇编吗?牛!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-24 19:51:01 | 显示全部楼层
#求满足a<b<c,a+b+c=1000,a^2 + b^2 = c^2的a,b,c值


  1. try:
  2.     for a in range(1,998):
  3.         for b in range(a+1,999):
  4.             c = 1000 - a -b
  5.             if (a**2 + b**2) == c**2:
  6.                 raise ValueError
  7. except ValueError:
  8.     print('a = %d,b = %d,c = %d\na*b*c = %d'%(a,b,c,a*b*c))
复制代码



a = 200,b = 375,c = 425
a*b*c = 31875000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 23:41:59 | 显示全部楼层
本帖最后由 天之南 于 2017-4-30 23:43 编辑
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         //a+b+c=1000&a^2+b^2=c^2 ==> 2*a*b=(1000-c)^2-c^2               
  5.         int a, b, c;
  6.         for (c = 500;c > 0;c--)
  7.         {
  8.                 for (a = 1;a < c;a++)
  9.                 {
  10.                         int ab2 = (1000 - c)*(1000 - c) - c*c;
  11.                         if (ab2 % (2 * a) == 0)
  12.                         {
  13.                                 b = ab2 / (2 * a);
  14.                                 if (a + b + c == 1000)
  15.                                 {
  16.                                         printf("a=%d b=%d c=%d\n ", a, b, c);
  17.                                         return 0;
  18.                                 }
  19.                         }
  20.                 }
  21.         }
  22.         return 0;
  23. }
复制代码

a=200 b=375 c=425
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-30 23:55:28 | 显示全部楼层
本帖最后由 天之南 于 2017-5-1 00:01 编辑
  1. #include<stdio.h>

  2. int main()
  3. {
  4.        
  5.         for (int a = 1;a < 500;a++)       
  6.                 for (int b = a;b < 500; b++)
  7.                 {
  8.                         int c = 1000 - a - b;
  9.                         if (a*a + b*b == c*c)
  10.                         {
  11.                                 printf("%d %d %d\n", a, b, c);
  12.                                 return 0;
  13.                         }
  14.                 }
  15.         return 0;
  16. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 18:44:31 | 显示全部楼层
答案是 a = 200, b = 375, c = 425。
a x b x c = 31875000
其实如果是找这些勾股数还是难找的,但是因为有三者和为1000又说是唯一的,这就好找多了。

  1. #include<stdio.h>
  2. //本来找数是挺复杂的,但是给出 a + b + c = 1000后马上减轻好多。
  3. int main(void)
  4. {       
  5.         int a,b,c;
  6.         for(a=1;a<1000;++a)
  7.         {
  8.                 for(b=a;b<1000-a;++b)
  9.                 {
  10.                         c=1000-a-b;
  11.                         if((a*a+b*b)==c*c)
  12.                                 goto Point;
  13.                 }
  14.         }
  15. Point:
  16.         printf("a = %d, b = %d, c = %d\n",a,b,c);
  17.         printf("a x b x c = %d\n",a*b*c);
  18.         return 0;
  19. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 11:51:47 | 显示全部楼层
  1. #找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}
  2. for a in range(0,1000):
  3.     for b in range(a+1,1000):
  4.         c=1000-a-b
  5.         if(a**2+b**2==c**2 and c>b):
  6.             print("%d*%d*%d=%d"%(a,b,c,a*b*c))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-12 13:52:18 | 显示全部楼层
  1. flage = False
  2. for a in range(10,1000,10):
  3.     for b in range(a,1000):
  4.         c = 1000 - a - b
  5.         if a * a + b * b == c * c:
  6.             print('{0}*{1} + {2}*{3} = {4}*{5}'.format(a,a,b,b,c,c))
  7.             flage = True
  8.             break
  9.     if flage:
  10.         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-4 17:04:48 | 显示全部楼层
答案 200  375 425

#include <stdio.h>
#include <math.h>

int main(void)
{
        int a,b,c;
        for(a=1; a<300; a++)
        {
                for ( b=a+1; b<1000; b++)
               
                {
                        //
                       
                        if((int)(sqrt(a*a+b*b))-sqrt(a*a+b*b)==0)
                        {   c=sqrt(a*a+b*b);
                                if ( a<b<c && a+b+c==1000 )
                            {
                                printf("%d  %d  %d \n",a,b,c);
                            }
                        }
                       
                }
        }
       
       
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油  发表于 2018-3-7 22:19:18
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a=1,b,c,t;
  5.         for(c=997;;c--)
  6.         {
  7.                 for(b=2;a>0;b++)
  8.                 {
  9.                         a=1000-b-c;
  10.                         if(c*c==b*b+a*a&&0!=a)
  11.                         {
  12.                                 if(b<a)
  13.                                 {
  14.                                         t=a;
  15.                                         a=b;
  16.                                         b=t;
  17.                                 }
  18.                                 printf("%d %d %d\n",a,b,c);
  19.                                 return 0;
  20.                         }
  21.                 }
  22.                 a=1;
  23.         }
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具

发表于 2018-6-20 20:33:15 | 显示全部楼层
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
        int a,b,c1;
        double c2;
        for(a=1;a<500;a++)
        {
                for(b=1;b<500;b++)
                {
                        c2=sqrt(a*a+b*b);
                        c1=(int)sqrt(a*a+b*b);
                        if(c1==c2 && a+b+c1==1000)
                        {
                                cout<<"a="<<a<<endl<<"b="<<b<<endl<<"c="<<c1<<endl;
                                return 0;
                        }
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 13:05:01 | 显示全部楼层
  1. for a in range(1, 1000):
  2.     for b in range(1, 1000):
  3.         if (1000-a)*(1000-b) == (1000*1000)/2:
  4.             print(a*b*(1000-a-b))
复制代码

3187500
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-30 13:49:24 | 显示全部楼层
  1. def b1():
  2.         x = 1
  3.         while x < 1000:
  4.                 y = x + 1
  5.                 while y < 1000:
  6.                         z = 1000 - x -y
  7.                         if x**2 + y**2 == z**2 :       
  8.                                 print('x:%d\ny:%d\nz:%d'%(x,y,z))
  9.                                 print('x*x:%d  ; y*y:%d ; z*z:%d'%(x**2,y**2,z**2))
  10.                                 print('x + y + z == %s'%(x + y + z))
  11.                                 print('x*y*z=%d'%(x*y*z))
  12.                         y += 1
  13.                 x += 1
复制代码
  1. def b2():
  2.         for a in range(1000):
  3.                 for b in range(a,1000):
  4.                         c = 1000 - a- b
  5.                         if a*a+b*b == c*c and c>b:
  6.                                 print (a*b*c)
复制代码

b1 :跑了1.3秒
b2::跑了0.4秒     为什么for 得到比 while 还要快乐? 有人解释下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-15 19:57:25 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i,j,k,sum,result;
  5.         for(i=0;i<=1000;i++)
  6.         {
  7.                 for(j=i+1;j<=1000;j++)
  8.                 {
  9.                         for(k=j+1;k<=1000;k++)
  10.                         {
  11.                                 sum=i+j+k;
  12.                                 if(sum==1000&&(i*i+j*j==k*k))
  13.                                 {
  14.                                         result=i*j*k;
  15.                                         printf("三元组中abc的乘积为:%d,其中a=%d;b=%d;;c=%d;",result,i,j,k);
  16.                                         return 0;
  17.                                 }
  18.                         }
  19.                 }
  20.         }
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-10 14:52:33 | 显示全部楼层
运行结果:(200, 375, 425)
运行时间:0.37440239999999997

  1. def get_re():
  2.     for x in range(1, 1001):
  3.         for y in range(1, 1001):
  4.             z = 1000 - x - y
  5.             if x**2 + y**2 == z**2:
  6.                 return x, y, z
  7. print(get_re())
  8. print(time.process_time())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-29 20:40:22 | 显示全部楼层
  1. #毕达哥拉斯三元数组
  2. import time

  3. start=time.clock()
  4. def calcu(x):
  5.     for a in range(1,x//3):
  6.         for b in range(a,x//2):
  7.             c=1000-a-b
  8.             if a*a+b*b==c*c:
  9.                 return a,b,c,a*b*c

  10. result=calcu(1000)
  11. print(result)
  12. end=time.clock()
  13. print("共用了%fs"%(end-start))
复制代码


(200, 375, 425, 31875000)
共用了0.043057s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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