余欲渔 发表于 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
>>>

99592938 发表于 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

JonTargaryen 发表于 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;
}

JonTargaryen 发表于 2017-3-28 15:57:56

JonTargaryen 发表于 2017-3-28 15:53


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()

凌晨分子 发表于 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时便是找到了对应值了。

凌晨分子 发表于 2017-4-6 22:59:00

fc1735 发表于 2016-11-21 23:52
general solution




卧槽,这是汇编吗?牛!{:5_106:}

Eagle.Tong 发表于 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

天之南 发表于 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

天之南 发表于 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;
}

铭记太阳 发表于 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;
}

麦特的灰 发表于 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))

BngThea 发表于 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

zjhnz 发表于 2018-1-4 17:04:48

答案 200375 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;
}

发表于 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;
        }
}

zzzgod 发表于 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;
                        }
                }
        }
}

山有扶苏啊 发表于 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

cupbbboom 发表于 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 还要快乐? 有人解释下吗{:9_241:}

愿你 发表于 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;
                                }
                        }
                }
        }
}

王小召 发表于 2019-4-10 14:52:33

运行结果:(200, 375, 425)
运行时间:0.37440239999999997

def get_re():
    for x in range(1, 1001):
      for y in range(1, 1001):
            z = 1000 - x - y
            if x**2 + y**2 == z**2:
                return x, y, z
print(get_re())
print(time.process_time())

zero-花鸟雪月 发表于 2019-4-29 20:40:22

#毕达哥拉斯三元数组
import time

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

result=calcu(1000)
print(result)
end=time.clock()
print("共用了%fs"%(end-start))

(200, 375, 425, 31875000)
共用了0.043057s
页: 1 [2] 3 4
查看完整版本: 题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}