鱼C论坛

 找回密码
 立即注册
查看: 6846|回复: 66

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

[复制链接]
发表于 2015-4-21 00:14:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2017-6-11 06:24 编辑
Special Pythagorean triplet

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,

a2 + b2 = c2


For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.


题目:

一个毕达哥拉斯三元组是一个包含三个自然数的集合,a < b < c,满足条件:

a2 + b2 = c2


例如:32 + 42 = 9 + 16 = 25 = 52

已知存在并且只存在一个毕达哥拉斯三元组满足条件 a + b + c = 1000。

找出该三元组中 abc 的乘积。

评分

参与人数 1贡献 +1 收起 理由
cwhsmile + 1 (乘积31875000, 数字200, 375, 425)用时0.3.

查看全部评分

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

使用道具 举报

发表于 2015-4-21 11:09:36 From FishC Mobile | 显示全部楼层
本帖最后由 s1986q 于 2015-4-21 11:11 编辑

答案是:200 ,375, 425。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-16 22:24:38 | 显示全部楼层
本帖最后由 翅膀团 于 2015-11-16 14:11 编辑

#include <stdio.h>

int a=0,b=1,c=2;

int main(void)
{
    void comparison();
    while(!((a*a+b*b==c*c) && (a+b+c==1000)))
    {
        comparison();
    }
    printf("a=%d,b=%d,c=%d\n",a,b,c);
}

void comparison()
{
    if( b-a == 1)
{
    if( c-b == 1)
{
    c++;
    a=0,b=1;
    return;
}
else
{
    b++;
    a=0;
    return;
}
}
else
{
    a++;
    return;
}
}

如果有错误希望指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2015-7-19 22:01:53 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<math.h>
  3. void main()
  4. {
  5.         int a, b, c,t;
  6.         for(a = 3;a<500;a++) //a = 3 起递增
  7.         {
  8.                 for(b = a+1;b<500;b++) // b = a + 1 起递增 应为 b > a
  9.                 {
  10.                         t = a*a+b*b; //t = a 的平方 + b 的平方
  11.                         c = sqrt(t);  // c = t 的平方根
  12.                         if(c*c==t) //如果 c 的平方 = t 说明 a^2+b^2=c^2成立
  13.                         {
  14.                                 if(a + b + c == 1000) //判断三个数的和是否为1000
  15.                                 {
  16.                                         printf("%d^2 + %d^2 = %d^2 %d * %d * %d = %d\n\n",a, b, c, a, b, c, a*b*c);
  17.                                         goto s;
  18.                                 }
  19.                         }
  20.                 }
  21.         }
  22. s:printf("\n");
  23. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-10-8 18:26:42 | 显示全部楼层
(200, 375, 425)-->31875000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-24 13:08:03 | 显示全部楼层
  1. #python 2.7.11

  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
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-11 13:04:51 | 显示全部楼层
本帖最后由 飘飞的白杨 于 2016-6-15 12:03 编辑

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

使用道具 举报

发表于 2016-6-13 17:20:23 | 显示全部楼层
  1. for a in range(1,1000):
  2.     for b in range(a,1000):
  3.         if a**2+b**2==(1000-a-b)**2:
  4.             print(a,b,1000-a-b)
  5.             break
  6.         
复制代码


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

使用道具 举报

发表于 2016-7-11 19:37:19 | 显示全部楼层
  1. def Pythagorean():
  2.     for a in range(1,999):
  3.         for b in range(a,999):
  4.             for c in range(b,999):
  5.                 if a+b+c==1000:
  6.                     if (pow(a, 2) + pow(b, 2) == pow(c, 2)):
  7.                         print(a,b,c)
  8.                         return 0

  9. Pythagorean()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 10:13:12 | 显示全部楼层
#include<stdio.h>
#include<math.h>
int a,b,c;
#define NUM 1000

int main(int argc,char *argv[])//
{
for(a=333;a<NUM;a++)
for(b=1;b<a;b++)
{
c=NUM-a-b;
if(judeg()==1)
{
printf("the answer was a=%d,b=%d,c=%d\n",a,b,c);
goto loop1;
}
}
loop1:
printf("the end!!!");
}


int judeg(void)
{
if(a*a==b*b+c*c)
return 1;
else return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-8-26 17:15:54 | 显示全部楼层
  1. for a in range(1,333):
  2.     for b in range(max(a,500-a),500):
  3.         if a**2+b**2 == (1000-a-b)**2:
  4.             print(a,b,1000-a-b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-10 15:17:16 | 显示全部楼层
  1. def euler(x):
  2.     for i in range(1,1000):
  3.         for j in range(i,1000):
  4.             if i + j + (i**2+j**2)**0.5 == x:
  5.                 return i*j*((i**2+j**2)**0.5)

  6. if __name__ == '__main__':
  7.     print(euler(1000))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-9 23:35:11 | 显示全部楼层
  1. for a in range(500):
  2.     for b in range(a,500):
  3.         for c in range(b,500):
  4.             if (a*a + b*b == c*c)&(a+b+c == 1000):
  5.                 print(a,b,c,a*b*c)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-11 17:09:39 | 显示全部楼层
  1. """
  2. 一个毕达哥达斯三元组是一个包含三个自然数的集合
  3. a<b<c,且满足条件:
  4. a*a+b*b=c*c
  5. 如3*3+4*4=5*5
  6. 已知存在并且只存在一个毕达哥拉斯三元组满足条件a+b+c=1000
  7. 找出该三元组中abc的乘积
  8. """
  9. import time

  10. start=time.clock()
  11. #先定义一个判断是否为毕达哥拉斯三元组的函数
  12. def isPytha(a,b,c):
  13.     if (a+b)<c:
  14.         return False
  15.     elif a*a+b*b==c*c:
  16.         return True
  17.     else:
  18.         return False


  19. def findS(num):
  20.     for a in range(1,num//3):
  21.         for b in range(a+1,num-1):
  22.             for c in range(b+1,num):
  23.                 if isPytha(a,b,c) and a+b+c==num:
  24.                     print("满足条件的三元组三个数字分别为:")
  25.                     print("a="+str(a))
  26.                     print("b="+str(b))
  27.                     print("c="+str(c))
  28.                     print("三数乘积为:"+str(a*b*c))
  29.                
  30. findS(1000)
  31. end=time.clock()
  32. print("运行耗时:"+str(end-start)+"秒")
  33.                     
  34.                     
  35.    
  36.    
复制代码


效率比较低。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-12 15:07:29 | 显示全部楼层
  1. # Python 3.5实现毕达哥拉斯三元组
  2. # a < b < c
  3. # a + b + c = 1000且a^2 + b^2 = c^2

  4. def pythagoreanTriplet(n):
  5.     upLimit = n //2 # n
  6.     for a in range(1, upLimit):
  7.         for b in range(a + 1, upLimit):
  8.             c = n - (a + b)
  9.             if c > b:
  10.                 if a**2 + b**2 == c**2:
  11.                     return (a, b, c)

  12. n = 1000
  13. PT = pythagoreanTriplet(n)
  14. print('满足a + b + c = %d的毕达哥拉斯三元组为a = %d, b = %d, c = %d'\
  15.       %(n, PT[0],PT[1],PT[2]))
  16. product = PT[0] * PT[1] * PT[2]
  17. print('该三元组中abc的乘积为%d'%product)
复制代码


>>>
满足a + b + c = 1000的毕达哥拉斯三元组为a = 200, b = 375, c = 425
该三元组中abc的乘积为31875000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-18 09:59:34 | 显示全部楼层
本帖最后由 lyciam 于 2016-11-18 10:09 编辑
  1. print({a*b*(1000-a-b):[a,b,1000-a-b] for a in range(1,1000) for b in range(a,1000) if a**2+b**2 == (1000-a-b)**2})
复制代码


{31875000: [200, 375, 425]}

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

使用道具 举报

发表于 2017-1-9 11:08:31 | 显示全部楼层
  1. # encoding:utf-8
  2. from time import time
  3. def euler008():
  4.     for z in range(334, 1000):
  5.         for y in range(2, z):
  6.             for x in range(1, y):
  7.                 if (x + y + z == 1000) and (x ** 2 + y ** 2 == z ** 2):
  8.                     print ('x = %d, y = %d, z = %d, x * y * z = %d' % (x, y, z, x * y * z))
  9.                     return

  10. start = time()            
  11. euler008()
  12. print('cost %.3f sec' % (time() - start))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-13 11:45:43 | 显示全部楼层
此代码使用matlab编程
Problem9所用时间为0.0090387秒
Problem9的答案为31875000
  1. %题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}
  2. function Output=Problem9(Input)
  3. tic
  4. if nargin==0
  5.     Input=1000;
  6. end
  7. Flag=0;
  8. for ii=Input-2:-1:1
  9.     C=ii;
  10.     for jj=Input-C-1:-1:1
  11.         B=jj;
  12.         A=Input-C-B;
  13.         if C^2==A^2+B^2;
  14.             Output=A*B*C;
  15.             Flag=1;
  16.             break
  17.         end
  18.     end
  19.     if Flag==1
  20.         break
  21.     end
  22. end        
  23. disp('此代码使用matlab编程')
  24. disp(['Problem9所用时间为',num2str(toc),'秒'])
  25. disp(['Problem9的答案为',num2str(Output)])
  26. end
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-2 19:48:14 | 显示全部楼层
  1. '''
  2. 思路:
  3. 根据a、b、c的关系,可推出a、b、c为直角三角形的三条边,其中c为斜边。
  4. 那么有c < a + b,a < 1000 // 3,b < 500
  5. '''

  6. import time

  7. def find_product(sum_abc=1000):
  8.     '找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}'
  9.     list_abc = []
  10.     for a in range(1, 1000 // 3):
  11.         for b in range(a, 500):
  12.             if a ** 2 + b ** 2 == (sum_abc - a - b) ** 2:
  13.                 list_abc.append(a)
  14.                 list_abc.append(b)
  15.                 list_abc.append(sum_abc - a - b)
  16.                 return list_abc

  17. start = time.clock()
  18. product = find_product()
  19. print('a、b、c为', product)
  20. print('a、b、c的乘积为%d' %(product[0] * product[1] * product[2]))
  21. end = time.clock()
  22. print('程序执行了%fs。' %(end - start))
复制代码

执行结果:
a、b、c为 [200, 375, 425]
a、b、c的乘积为31875000
程序执行了0.147941s。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-21 22:51:32 | 显示全部楼层
借鉴了一下楼上的思路,用c写的
  1. /*题目:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c} 并输出其积*/

  2. #include <stdio.h>

  3. int main()
  4. {
  5.     int a, b, c;
  6.     for(a=1; a<=333; a++)
  7.     {
  8.         for(b=1; b<=500; b++)
  9.         {
  10.             c = 1000 - a - b;
  11.             if(a*a + b*b == c*c)
  12.             {
  13.                 goto z;
  14.             }
  15.         }
  16.     }
  17.     z: printf("a = %d, b = %d, c = %d, a * b * c = %d\n", a, b, c, a*b*c);
  18.     return 0;
  19. }
复制代码

a = 200, b = 375, c = 425, a * b * c = 31875000

Process returned 0 (0x0)   execution time : 0.019 s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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