如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有abc可能的组合?Java/JavaScript/C/Python耗时对比

Posted 不识少年愁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有abc可能的组合?Java/JavaScript/C/Python耗时对比相关的知识,希望对你有一定的参考价值。

 

如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?

不考虑算法优化,一千万次循环计算判断 Java/JavaScript/C/Python 多次测试耗时对比。

 

Java

单次总耗时957毫秒

import java.util.Date;


public class algorithm {
    public static void main(String[] args) {
        long start  = new Date().getTime();
        for (int a = 0; a < 1001; a++) {
            for (int b = 0; b < 1001; b++) {
                for (int c = 0; c < 1001; c++) {
                    if (a + b + c == 1000 && a*a + b*b == c*c){
                        System.out.print(a + " ");
                        System.out.print(b + " ");
                        System.out.print(c + " ");
                        System.out.println(new Date().getTime() - start);
                    }
                }
            }
        }
        System.out.println(new Date().getTime() - start);
    }
}
/*
单位毫秒
0 500 500 3
200 375 425 192
375 200 425 434
500 0 500 524
957
*/

 

JavaScript

单次总耗时1707毫秒

start = new Date().getTime();
// console.log(start)
for (let a = 0; a < 1001; a++) {
    for (let b = 0; b < 1001; b++) {
        for (let c = 0; c < 1001; c++) {
            if (a+b+c == 1000 && a*a + b*b == c*c){
                end = new Date().getTime();
                console.log(a, b, c , end-start);  
            }
        }
    }
}
console.log(new Date().getTime()-start);  // 1708
/*
0 500 500 4
200 375 425 310
375 200 425 624
500 0 500 841
1707
*/

 

C

单次总耗时2744毫秒,比较意外

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

int main () { clock_t start, finish; double elapsed_time; start=clock(); int a, b, c; for (a=0; a<1001; a++){ for (b=0; b<1001; b++){ for (c=0; c<1001; c++){ if (a+b+c == 1000 && a*a + b*b == c*c){ finish=clock(); printf("%d %d %d %d ", a, b, c, finish); } } } } finish = clock(); printf("%d ", finish); return 0; } /* 0 500 500 1 200 375 425 546 375 200 425 1019 500 0 500 1360 2744 */

 

Python

单次总耗时132秒

import time


start = time.time()
for a in range(1001):
    for b in range(1001):
        for c in range(1001):
            if a + b + c == 1000 and a ** 2 + b ** 2 == c ** 2:
                print(a, b, c, time.time()-start)

print(time.time()- start)

"""
0 500 500 0.06199979782104492
200 375 425 25.329999685287476
375 200 425 49.39399981498718
500 0 500 66.0019998550415
132.76599979400635
"""

 

优化后的Pyhton

0.24秒
import math
import time


start = time.time()
for c in range(int(math.sqrt(2) * 1000 - 1000), 1001):
    for a in range(1001 - c):
        b = 1000 - a - c
        if a + b + c == 1000 and a ** 2 + b ** 2 == c ** 2:
            print(a, b, c, time.time()-start)

print(time.time()- start)
"""
200 375 425 0.007999897003173828
375 200 425 0.01900005340576172
0 500 500 0.07599997520446777
500 0 500 0.0819997787475586
0.23999977111816406
"""

 

 

 

 

 

 

 

以上是关于如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有abc可能的组合?Java/JavaScript/C/Python耗时对比的主要内容,如果未能解决你的问题,请参考以下文章

时间复杂度与大O记法的理解

数论论论论论论论论论

已知两个整数a,b,且a+b=c,要求输入:a,b; 输出:c

第2章 关系1

卧槽!复旦小姐姐原创数据结构和算法系列1.算法和数据结构的引入

shell if 参数