永恒的蓝色梦想 发表于 2019-8-3 16:19:29

本帖最后由 永恒的蓝色梦想 于 2020-8-2 19:29 编辑

for b in range(1,999):
    for a in range(1, b):
      c = 100 - a - b

      if a * a + b * b == c * c:
            print(a * b * c)
            exit()

1666194196 发表于 2019-10-10 08:44:04

#include <stdio.h>
#include<math.h>
void main(){
        //特殊 毕达哥拉斯三元组
        //毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足
        //a2 + b2 = c2
        //例如,3^2 + 4^2 = 9 + 16 = 25 = 5^2。
        //有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。
       
        int a,b,c;
        for(a=0;a<333;a++){ //a+b+c=1000 且 a<b<c 所有 a<333否则 333 + 334 +335 >1000了
               for(b=a+1;b<500;b++){//如果 b>=500 c>bb+c就大于 1000了 ,所以 b<500
                          c = sqrt(b*b+a*a);//c=根号下 a*a+b*b
                       if(c*c==b*b+a*a&&a+b+c==1000){//满足两个条件 则输出....
                               printf("a=%d,b=%d,c=%d,a*b*c=%d",a,b,c,a*b*c);
                       }
               }
               
        }
       
}

foxiangzun 发表于 2019-11-5 20:21:33

1、这三个数实际存在,且不为 0
2、这三个数的平方数符合勾股定理
3、这三个数之和刚好 1000

刚开始考虑到用穷举法,但是如果三个数都穷举,那么算法复杂度就是 O(N3),代价太大,消耗的资源和时间都太长,所以,即使用穷举,也最好能将循环控制到最小,那么用两层循环即可,代码如下:


for i in range(1, 999) :
      for j in range(1, 999) :
                if (i * i + j * j == pow(1000 - i - j, 2)) and (i < j < (1000 - i - j)) :
                        print(i, j, 1000 - i - j)
                        print(i * j * (1000 - i - j))
                        break

来自异界的飞猪 发表于 2019-11-27 20:33:59

翅膀团 发表于 2015-7-16 22:24
#include

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


函数中的 那些判断条件实干吗的没看懂,方便给讲一讲吗{:10_256:}

guoquanli 发表于 2019-12-31 18:00:20

#include <stdio.h>
#include <stdlib.h>
#include "string.h"
int main(void)
{
      for(int a = 1 ; a <= 1000; a++){
            for(int b = a + 1; b <= 1000; b++){
                for(int c = b+1; c <= 1000; c++){
                  if(a*a + b*b == c*c && a+b+c ==1000){
                        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

代号-K 发表于 2020-3-12 18:57:07

本帖最后由 代号-K 于 2020-3-12 19:01 编辑

answer:200, 375, 425
首先把方程式化简一下;
void getPythagorean(int *a, int *b)
{
    int i, j;
    for(i = 1; i < 334; i++)
    {
      for(j = 500 - i; j <500; j++)
      {
            if( i*j % 1000 == 0)
            {
                if(500 + i*j/1000 - i - j == 0)
                {
                  *a = i;
                  *b = j;
                  return;
                }
            }
      }
    }
}

int main(int argc, char *argv[])
{
    ElementTyperet;
    int a;
    int b;
    getPythagorean(&a, &b);
    printf("answer:%d, %d, %d\n",a, b, 1000 - (a + b));
    return 0;
}

leon0149 发表于 2020-5-8 23:50:01

本帖最后由 leon0149 于 2020-5-8 23:52 编辑

#include <stdio.h>
#include <time.h>

int main(void)
{
    clock_t start, finish;
    double duration;
    start = clock();
    for (int i = 1; i < 300; ++i) {
      for (int j = i + 1;j < 1000; ++j) {
            int k = 1000 - i - j;
            if (k < j)
                goto here;
            else{
                if (i * i + j * j == k * k) {
                  printf("%d * %d * %d = %d\n", i, j, k, i * j * k);
                  finish = clock();
                  duration = (double )(finish - start) / CLOCKS_PER_SEC;
                  printf("%.3f s", duration);
                  return 0;
                }
            }
      }
      here:
      1;
    }

    return 0;
}
输出结果:
200 * 375 * 425 = 31875000
0.000 s

q327363363 发表于 2020-6-1 11:06:34

for a in range(1,998):
    for b in range(1,998):
      for c in range(1,998):
            if a**2+b**2==c**2 and a+b+c<1000:
                print(a,b,c)

数据小随从 发表于 2020-6-11 20:14:56

本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:02 编辑

#include<stdio.h>
#include<stdlib.h>


void main()
{
        int i, j;
        long result;
        for (i = 1; i < 1000; i++)
        {
                for (j = i; (j < 1000 && j < (1000 - i - j)); j++)
                {
                        if (i * i + j * j == (1000 - i - j)*(1000 - i - j))
                        {
                                printf("%d^2+%d^2=%d^2\n", i, j, 1000 - i - j);
                                printf("这三个数的乘积=%ld\n", i*j*(1000 - i - j));
                                break;
                        }
                }

        }
        system("pause");
}

输出结果为:200^2+375^2=425^2
                   这三个数的乘积=31875000

xuan1788 发表于 2020-7-23 17:16:33

import time
from time import time
def main():
        start = time()
        print({a*b*(1000-a-b): for a in range(1, 1000//3) for b in range(500) if a**2 + b**2 == (1000-a-b)**2})
        print(time() - start)

if __name__ == "__main__":
      main()

{31875000: }
0.2583038806915283

583164028 发表于 2020-8-10 09:49:58

幻世伽蓝 发表于 2016-7-11 19:37


严重鄙视这种三重for循环的搞法

yhhpf 发表于 2020-8-24 15:14:51

for a in range(1,1000):
      for b in range(a,1000):
                if a*a+b*b == (1000-a-b)**2:
                        print (a*b*(1000-a-b))
                        break

4444567 发表于 2020-8-31 23:44:43

def bd(a,b,c):
    m =
    i = min(m)
    j = max(m)
    m.remove(i)
    m.remove(j)
    k = m
   
    if (i*i + k*k == j*j):
      return True

for i in range(0,1000):
    for j in range(i+1,1000):
      k = 1000 - i -j
      if bd(i,j,k) and k>j:
            print(i,j,k)      
            print(i*j*k)

有马_冬巳 发表于 2020-10-4 11:27:48

'''一个毕达哥拉斯三元组是一个包含三个自然数的集合,a < b < c,满足条件:a2 + b2 = c2
例如:32 + 42 = 9 + 16 = 25 = 52。
已知存在并且只存在一个毕达哥拉斯三元组满足条件 a + b + c = 1000。
找出该三元组中 abc 的乘积。'''

def pythagorean():
    for a in range(1,500):
      for b in range(1,500):
            if a**2 + b**2 == (1000-a-b)**2:
                print("该三元组是: %d,%d,%d" %(a,b,1000-a-b))
                break
      if a**2 + b**2 == (1000-a-b)**2:
            break

start_pythagorean = time.time()
pythagorean()
time_pythagorean = time.time() - start_pythagorean
print("%f秒" %time_pythagorean)


该三元组是: 200,375,425
0.062495秒

gonorth 发表于 2020-11-5 15:41:16

def spt():
    for a in range(1000):
      for b in range(a , 1000):
            for c in range(b, 1000):
                if (a + b + c) == 1000 and ((a** 2 + b ** 2) == c ** 2) and a < b < c:
                  print (a , b ,c , a*b*c)

a1351468657 发表于 2021-3-6 16:47:13

#include <stdio.h>

main()
{
        int a, b, c;

        for (a = 1; a < 1000; a++)
        {
                for (b = a; b < 1000; b++)
                {
                        c = 1000 - a - b;
                        if ((a * a + b * b) == c * c)
                        {
                                printf("a = %d, b = %d, c = %d", a, b, c);
                                break;
                        }
                        if (c <= b)
                        {
                                goto Label;
                        }
                }
        Label:continue;
        }
}

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

Kuri5u 发表于 2021-5-6 23:33:40

for a in range(100,800):
    for b in range(100,800):
      c=1000-a-b
      if c**2==a**2+b**2 and a<b<c:
            print(f"{a} {b} {c} {a*b*c}")   

200 375 425 31875000

卢本伟牛逼 发表于 2021-8-10 22:12:09

#include <stdio.h>

// 1、a^2 + b^2 = C^2
// 2、c = 1000 - a - b
// 极坐标化
// rcosx + rsinx = r^2
// r = 1000 / (sinx + cosx + 1) -> c(414 ~ 500)
// (a < b < c)

static count = 0;

void method1(void)
{
        int a,b,c;
       
        for(c = 414; c <= 500; c++)
        {//a + b =1000 - c
                for(a = 1; a < b; a++)
                {
                        count += 1;
                        b = 1000 - c - a;
                        if (a*a + b*b == c*c){
                                printf("method1 result:\n");
                                printf("a = %d, b = %d, c = %d\n", a,b,c);
                                printf("count = %d\n", count);
                                return;
                        }
                }
        }
        printf("Can't' find~\n'");
}

void method2(void)
{
        int a,b,c;
        for(c = 1;c<1000;c++){
                for(a = 1;a<b;a++){
                        count += 1;
                        b = 1000 - c - a;
                        if (a*a + b*b == c*c){
                                printf("method1 result:\n");
                                printf("a = %d, b = %d, c = %d\n", a,b,c);
                                printf("count = %d\n", count);
                                return;
                        }
                }
        }
        printf("Can't' find~\n'");
}

int main(void)
{
        method1();
        method2();
        return 0;
}
//method1 - count = 3393, a = 200, b = 375, c = 425;
//method2 - count = 167004, a = 200, b = 375, c = 425;
{:10_256:}

ft215378 发表于 2021-10-10 21:28:57

for x in range(500):
      for y in range(x,500):
                z = 1000 - x - y
                if x**2+y**2 == z**2 and z>y:
                        print(x,y,z)

番杰 发表于 2021-10-27 15:30:05

#include<stdio.h>

int mian(void)
{
        int a,b,c;
        int flag = 0;
       
        for(int i = 1;i<333;i++)
        {
               for(int j = i+1;j<500;j++)
               (
                        c = 1000-i-j;
                        if(c < j)
                                break;
                        if(i*i+j*j == c*c)
                        {
                                flag = 1;
                                a = i;
                                b = j;
                                break;
                        }       
                )
               
                if(flag == 1)
                        break;
        }
       
        printf("(%d,%d,%d)",a,b,c);
       
        return 0;
}
页: 1 2 [3] 4
查看完整版本: 题目9:找出唯一的满足a + b + c = 1000的毕达哥拉斯三元组{a, b, c}