鱼C论坛

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

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

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

import time

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

start = time.clock()
product = find_product()
print('a、b、c为', product)
print('a、b、c的乘积为%d' %(product[0] * product[1] * product[2]))
end = time.clock()
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写的
/*题目:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c} 并输出其积*/

#include <stdio.h>

int main()
{
    int a, b, c;
    for(a=1; a<=333; a++)
    {
        for(b=1; b<=500; b++)
        {
            c = 1000 - a - b;
            if(a*a + b*b == c*c)
            {
                goto z;
            }
        }
    }
    z: printf("a = %d, b = %d, c = %d, a * b * c = %d\n", a, b, c, a*b*c);
    return 0;
}
a = 200, b = 375, c = 425, a * b * c = 31875000

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

使用道具 举报

发表于 2017-3-2 12:14:53 | 显示全部楼层
for c in range(1,500):
    for a in range(1,(1000-c)//2):
        b=1000-a-c
        if a**2+b**2==c**2:
            print(a*b*c,a,b,c)
            exit()
== RESTART: C:\Users\ASUS\AppData\Local\Programs\Python\Python35-32\test.py ==
31875000 200 375 425
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 17:23:07 | 显示全部楼层
import time
start = time.clock()
f=0
for a in range(0,500):
    for b in range(a,500):
        c=1000-a-b
        if(a**2+b**2)==c**2:
            print('a=%d b=%d c=%d' %(a,b,c))
            f=1
            break
    if f:break
end = time.clock()
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就可以了

#include <stdio.h>

#define NUM 1000

int main(void)
{
    int a, b, c;

    for(a = 1; a < NUM / 2; a++)
    {
        for(b = a; b < NUM / 2; b++)
        {
            c = NUM - a - b;

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

                return 0
            }
        }
    }

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

使用道具 举报

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

def main():
    for a in range(500):
        for b in range(a, 500):
            c = 1000 - a - b

            if a * a + b * b == c * c:
                print(a, b, c)
                return

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

使用道具 举报

发表于 2017-4-6 22:56:46 | 显示全部楼层
结果:
a=200, b=375, c=425, a*b*c=31875000
代码如下:
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值

try:
    for a in range(1,998):
        for b in range(a+1,999):
            c = 1000 - a -b
            if (a**2 + b**2) == c**2:
                raise ValueError
except ValueError:
    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 编辑
#include<stdio.h>
int main()
{
        //a+b+c=1000&a^2+b^2=c^2 ==> 2*a*b=(1000-c)^2-c^2                
        int a, b, c;
        for (c = 500;c > 0;c--)
        {
                for (a = 1;a < c;a++)
                {
                        int ab2 = (1000 - c)*(1000 - c) - c*c;
                        if (ab2 % (2 * a) == 0)
                        {
                                b = ab2 / (2 * a);
                                if (a + b + c == 1000) 
                                {
                                        printf("a=%d b=%d c=%d\n ", a, b, c);
                                        return 0;
                                }
                        }
                }
        }
        return 0;
}
a=200 b=375 c=425
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2017-5-4 18:44:31 | 显示全部楼层
答案是 a = 200, b = 375, c = 425。
a x b x c = 31875000
其实如果是找这些勾股数还是难找的,但是因为有三者和为1000又说是唯一的,这就好找多了。
#include<stdio.h> 
//本来找数是挺复杂的,但是给出 a + b + c = 1000后马上减轻好多。 
int main(void)
{        
        int a,b,c;
        for(a=1;a<1000;++a)
        {
                for(b=a;b<1000-a;++b)
                {
                        c=1000-a-b;
                        if((a*a+b*b)==c*c)
                                goto Point;
                }
        }
Point:
        printf("a = %d, b = %d, c = %d\n",a,b,c);
        printf("a x b x c = %d\n",a*b*c);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2017-9-12 13:52:18 | 显示全部楼层
flage = False
for a in range(10,1000,10):
    for b in range(a,1000):
        c = 1000 - a - b
        if a * a + b * b == c * c:
            print('{0}*{1} + {2}*{3} = {4}*{5}'.format(a,a,b,b,c,c))
            flage = True
            break
    if flage:
        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
#include<stdio.h>
int main()
{
        int a=1,b,c,t;
        for(c=997;;c--)
        {
                for(b=2;a>0;b++)
                {
                        a=1000-b-c;
                        if(c*c==b*b+a*a&&0!=a)
                        {
                                if(b<a)
                                {
                                        t=a;
                                        a=b;
                                        b=t;
                                }
                                printf("%d %d %d\n",a,b,c);
                                return 0;
                        }
                }
                a=1;
        }
}
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
for a in range(1, 1000):
    for b in range(1, 1000):
        if (1000-a)*(1000-b) == (1000*1000)/2:
            print(a*b*(1000-a-b))
3187500
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-30 13:49:24 | 显示全部楼层
def b1():
        x = 1
        while x < 1000:
                y = x + 1
                while y < 1000:
                        z = 1000 - x -y
                        if x**2 + y**2 == z**2 :        
                                print('x:%d\ny:%d\nz:%d'%(x,y,z))
                                print('x*x:%d  ; y*y:%d ; z*z:%d'%(x**2,y**2,z**2))
                                print('x + y + z == %s'%(x + y + z))
                                print('x*y*z=%d'%(x*y*z))
                        y += 1
                x += 1
def b2():
        for a in range(1000):
                for b in range(a,1000):
                        c = 1000 - a- b
                        if a*a+b*b == c*c and c>b:
                                print (a*b*c)
b1 :跑了1.3秒
b2::跑了0.4秒     为什么for 得到比 while 还要快乐? 有人解释下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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