鱼C论坛

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

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

[复制链接]
发表于 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()
想知道小甲鱼最近在做啥?请访问 -> 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),代价太大,消耗的资源和时间都太长,所以,即使用穷举,也最好能将循环控制到最小,那么用两层循环即可,代码如下:

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
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
#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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[])
{
    ElementType  ret;
    int a;
    int b;
    getPythagorean(&a, &b);
    printf("answer:%d, %d, %d\n",a, b, 1000 - (a + b));
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2020-7-23 17:16:33 | 显示全部楼层
import time
from time import time
def main():
        start = time()
        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})
        print(time() - start)

if __name__ == "__main__":
      main()

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

使用道具 举报

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

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-8-31 23:44:43 | 显示全部楼层
def bd(a,b,c):
    m = [a,b,c]
    i = min(m)
    j = max(m)
    m.remove(i)
    m.remove(j)
    k = m[0]
    
    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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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秒
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
#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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 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;
想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层
#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; 
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 15:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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