鱼C论坛

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

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

[复制链接]
发表于 2019-8-3 16:19:29 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-8-2 19:29 编辑
  1. for b in range(1,999):
  2.     for a in range(1, b):
  3.         c = 100 - a - b

  4.         if a * a + b * b == c * c:
  5.             print(a * b * c)
  6.             exit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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>b  b+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);
                         }
                 }
               
        }
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-5 20:21:33 | 显示全部楼层
1、这三个数实际存在,且不为 0
2、这三个数的平方数符合勾股定理
3、这三个数之和刚好 1000

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


  1. for i in range(1, 999) :
  2.         for j in range(1, 999) :
  3.                 if (i * i + j * j == pow(1000 - i - j, 2)) and (i < j < (1000 - i - j)) :
  4.                         print(i, j, 1000 - i - j)
  5.                         print(i * j * (1000 - i - j))
  6.                         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-27 20:33:59 | 显示全部楼层
翅膀团 发表于 2015-7-16 22:24
#include

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

函数中的 那些判断条件实干吗的  没看懂,方便给讲一讲吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-31 18:00:20 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "string.h"
  4. int main(void)
  5. {
  6.         for(int a = 1 ; a <= 1000; a++){
  7.             for(int b = a + 1; b <= 1000; b++){
  8.                 for(int c = b+1; c <= 1000; c++){
  9.                     if(a*a + b*b == c*c && a+b+c ==1000){
  10.                         printf("a= %d|b = %d|c= %d|a*b*c = %d\n",a,b,c,a*b*c);
  11.                     }
  12.                 }
  13.             }
  14.         }
  15.         return 0;
  16. }
复制代码

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

使用道具 举报

发表于 2020-3-12 18:57:07 | 显示全部楼层
本帖最后由 代号-K 于 2020-3-12 19:01 编辑

answer:200, 375, 425
首先把方程式化简一下;
  1. void getPythagorean(int *a, int *b)
  2. {
  3.     int i, j;
  4.     for(i = 1; i < 334; i++)
  5.     {
  6.         for(j = 500 - i; j <  500; j++)
  7.         {
  8.             if( i*j % 1000 == 0)
  9.             {
  10.                 if(500 + i*j/1000 - i - j == 0)
  11.                 {
  12.                     *a = i;
  13.                     *b = j;
  14.                     return;
  15.                 }
  16.             }
  17.         }
  18.     }
  19. }

  20. int main(int argc, char *argv[])
  21. {
  22.     ElementType  ret;
  23.     int a;
  24.     int b;
  25.     getPythagorean(&a, &b);
  26.     printf("answer:%d, %d, %d\n",a, b, 1000 - (a + b));
  27.     return 0;
  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-8 23:50:01 | 显示全部楼层
本帖最后由 leon0149 于 2020-5-8 23:52 编辑
  1. #include <stdio.h>
  2. #include <time.h>

  3. int main(void)
  4. {
  5.     clock_t start, finish;
  6.     double duration;
  7.     start = clock();
  8.     for (int i = 1; i < 300; ++i) {
  9.         for (int j = i + 1;j < 1000; ++j) {
  10.             int k = 1000 - i - j;
  11.             if (k < j)
  12.                 goto here;
  13.             else{
  14.                 if (i * i + j * j == k * k) {
  15.                     printf("%d * %d * %d = %d\n", i, j, k, i * j * k);
  16.                     finish = clock();
  17.                     duration = (double )(finish - start) / CLOCKS_PER_SEC;
  18.                     printf("%.3f s", duration);
  19.                     return 0;
  20.                 }
  21.             }
  22.         }
  23.         here:
  24.         1;
  25.     }

  26.     return 0;
  27. }
复制代码

输出结果:
  1. 200 * 375 * 425 = 31875000
  2. 0.000 s
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2020-6-11 20:14:56 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-30 18:02 编辑
  1. #include<stdio.h>
  2. #include<stdlib.h>


  3. void main()
  4. {
  5.         int i, j;
  6.         long result;
  7.         for (i = 1; i < 1000; i++)
  8.         {
  9.                 for (j = i; (j < 1000 && j < (1000 - i - j)); j++)
  10.                 {
  11.                         if (i * i + j * j == (1000 - i - j)*(1000 - i - j))
  12.                         {
  13.                                 printf("%d^2+%d^2=%d^2\n", i, j, 1000 - i - j);
  14.                                 printf("这三个数的乘积=%ld\n", i*j*(1000 - i - j));
  15.                                 break;
  16.                         }
  17.                 }

  18.         }
  19.         system("pause");
  20. }
复制代码


输出结果为:200^2+375^2=425^2
                   这三个数的乘积=31875000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 17:16:33 | 显示全部楼层
  1. import time
  2. from time import time
  3. def main():
  4.         start = time()
  5.         print({a*b*(1000-a-b):[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})
  6.         print(time() - start)

  7. if __name__ == "__main__":
  8.       main()
复制代码


{31875000: [200, 375, 425]}
0.2583038806915283
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-10 09:49:58 | 显示全部楼层

严重鄙视这种三重for循环的搞法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 15:14:51 | 显示全部楼层
  1. for a in range(1,1000):
  2.         for b in range(a,1000):
  3.                 if a*a+b*b == (1000-a-b)**2:
  4.                         print (a*b*(1000-a-b))
  5.                         break
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
永恒的蓝色梦想 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2020-8-31 23:44:43 | 显示全部楼层
  1. def bd(a,b,c):
  2.     m = [a,b,c]
  3.     i = min(m)
  4.     j = max(m)
  5.     m.remove(i)
  6.     m.remove(j)
  7.     k = m[0]
  8.    
  9.     if (i*i + k*k == j*j):
  10.         return True

  11. for i in range(0,1000):
  12.     for j in range(i+1,1000):
  13.         k = 1000 - i -j
  14.         if bd(i,j,k) and k>j:
  15.             print(i,j,k)        
  16.             print(i*j*k)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-4 11:27:48 | 显示全部楼层
  1. '''一个毕达哥拉斯三元组是一个包含三个自然数的集合,a < b < c,满足条件:a2 + b2 = c2
  2. 例如:32 + 42 = 9 + 16 = 25 = 52。
  3. 已知存在并且只存在一个毕达哥拉斯三元组满足条件 a + b + c = 1000。
  4. 找出该三元组中 abc 的乘积。'''

  5. def pythagorean():
  6.     for a in range(1,500):
  7.         for b in range(1,500):
  8.             if a**2 + b**2 == (1000-a-b)**2:
  9.                 print("该三元组是: %d,%d,%d" %(a,b,1000-a-b))
  10.                 break
  11.         if a**2 + b**2 == (1000-a-b)**2:
  12.             break

  13. start_pythagorean = time.time()
  14. pythagorean()
  15. time_pythagorean = time.time() - start_pythagorean
  16. print("%f秒" %time_pythagorean)
复制代码



该三元组是: 200,375,425
0.062495秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2021-3-6 16:47:13 | 显示全部楼层
  1. #include <stdio.h>

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

  5.         for (a = 1; a < 1000; a++)
  6.         {
  7.                 for (b = a; b < 1000; b++)
  8.                 {
  9.                         c = 1000 - a - b;
  10.                         if ((a * a + b * b) == c * c)
  11.                         {
  12.                                 printf("a = %d, b = %d, c = %d", a, b, c);
  13.                                 break;
  14.                         }
  15.                         if (c <= b)
  16.                         {
  17.                                 goto Label;
  18.                         }
  19.                 }
  20.         Label:continue;
  21.         }
  22. }
复制代码


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

使用道具 举报

发表于 2021-5-6 23:33:40 | 显示全部楼层
  1. for a in range(100,800):
  2.     for b in range(100,800):
  3.         c=1000-a-b
  4.         if c**2==a**2+b**2 and a<b<c:
  5.             print(f"{a} {b} {c} {a*b*c}")   
复制代码

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

使用道具 举报

发表于 2021-8-10 22:12:09 | 显示全部楼层
  1. #include <stdio.h>

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

  8. static count = 0;

  9. void method1(void)
  10. {
  11.         int a,b,c;
  12.        
  13.         for(c = 414; c <= 500; c++)
  14.         {//a + b =  1000 - c
  15.                 for(a = 1; a < b; a++)
  16.                 {
  17.                         count += 1;
  18.                         b = 1000 - c - a;
  19.                         if (a*a + b*b == c*c){
  20.                                 printf("method1 result:\n");
  21.                                 printf("a = %d, b = %d, c = %d\n", a,b,c);
  22.                                 printf("count = %d\n", count);
  23.                                 return;
  24.                         }
  25.                 }
  26.         }
  27.         printf("Can't' find~\n'");
  28. }

  29. void method2(void)
  30. {
  31.         int a,b,c;
  32.         for(c = 1;c<1000;c++){
  33.                 for(a = 1;a<b;a++){
  34.                         count += 1;
  35.                         b = 1000 - c - a;
  36.                         if (a*a + b*b == c*c){
  37.                                 printf("method1 result:\n");
  38.                                 printf("a = %d, b = %d, c = %d\n", a,b,c);
  39.                                 printf("count = %d\n", count);
  40.                                 return;
  41.                         }
  42.                 }
  43.         }
  44.         printf("Can't' find~\n'");
  45. }

  46. int main(void)
  47. {
  48.         method1();
  49.         method2();
  50.         return 0;
  51. }
  52. //method1 - count = 3393, a = 200, b = 375, c = 425;
  53. //method2 - count = 167004, a = 200, b = 375, c = 425;
复制代码

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

使用道具 举报

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

使用道具 举报

发表于 2021-10-27 15:30:05 | 显示全部楼层
  1. #include<stdio.h>

  2. int mian(void)
  3. {
  4.         int a,b,c;
  5.         int flag = 0;
  6.        
  7.         for(int i = 1;i<333;i++)
  8.         {
  9.                  for(int j = i+1;j<500;j++)
  10.                  (
  11.                         c = 1000-i-j;
  12.                         if(c < j)
  13.                                 break;
  14.                         if(i*i+j*j == c*c)
  15.                         {
  16.                                 flag = 1;
  17.                                 a = i;
  18.                                 b = j;
  19.                                 break;
  20.                         }       
  21.                 )
  22.                
  23.                 if(flag == 1)
  24.                         break;
  25.         }
  26.        
  27.         printf("(%d,%d,%d)",a,b,c);
  28.        
  29.         return 0;
  30. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 01:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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