如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合?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\n", a, b, c, finish);
                }
            }
        }
    }
    finish = clock();
    printf("%d \n", 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
"""

原文地址:https://www.cnblogs.com/viete/p/12391920.html

时间: 2024-10-24 23:06:12

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

Java面向对象程序设计--与C++对比说明:系列1

面向对象程序设计作为一种重要的程序设计思想,在近些年来得到广泛的推崇.而Java和C++更是面向对象程序设计语言中的翘楚,要彻底摸清面向对象程序设计的精髓和在实际应用中更加高效的进行代码设计,我们有必要对比一下Java和C++的在实现面向对象程序设计上的异同之处,对两种语言的细节之处做一个详尽的了解. 面向对象程序设计概念: 面向对象编程技术并不是简单的替代了结构化编程技术,而是在结构化编程的基础上做了一个很大的提升.很多面向对象技术仍然是建立在结构化编程技术之上.这里有一个很明显的是函数指针和

Java的Comparator和Comparable对比

1.对象如何对比排序? Java的基本类型如int, float, double都可以直接使用java.util.Arrays.sort(Object[])对比排序,那对象是如何比较排序的呢?我们定义的类都是继承Object类的,Object类的equals的方法,默认是比较两个对象是否相等(hashcode相同) public boolean equals(Object obj) { return (this == obj); } 而我们现实要求一般不是这样比较,可以通过实现Comparabl

Java,泛型类型通配符和C#对比

指令系统 指令系统是计算机硬件的语言系统,与硬件的联系息息相关. 指令系统是指CPU所能够处理的全部指令的集合,是一个CPU的根本属性(指令系统决定了一个CPU能运行 什么样的程序).现在cpu仍然使用者X86指令集,不同类型的计算机包含的指令系统的种类和数目是不同的. 所有采用高级语言编出的程序,都需要编译或者解释成为机器语言后才能运行(编译原理),这些机器语 言中所包含的就是一条条的指令.一条指令就是机器语言的一个语句,它是一组有意义的二进制代码. 格式 零地址 在堆栈型计算机中,操作数一般

关于Python和Java的多进程多线程计算方法对比

原文请见 关于Python和Java的多进程多线程计算方法对比 搞大数据必须要正视的一个问题就是并行计算.就像执行一件任务一样,大伙一起同时干,才有效率,才会很快出成果.正所谓"众人拾柴火焰高"~ 对于并行计算,有很多高大上的概念,我也不全懂.这里就单单罗列一下我对于多进程和多线程计算的理解和总结. 在计算机中,处理一个任务,可以在一个进程中,也可以在一个线程中,确切的说,执行的话都得靠一个个线程来.在我们做某件事的时候,往往需要同时干多个任务才能达到我们所要的效果,比如说看电影,就要

Java面向对象程序设计--与C++对比说明:系列2(类机制)

1. Java中的包机制(Package): 1.1   Java容许将一系列的类组合到一个叫package的集合中.package机制是一种非常好的管理工作的方式并可以将你自己的工作和系统或第三方提供的代码分开. 一个类(class)可以使用其本身所在包中的任何类和其他包中的任何public类. 注意:只能使用*号来导入一个单独的包中的所有的类.像这种java.*或java.*.*形式的包的导入都是错误的. 例如:有两个包com.a.b和com.a.b.c,那么com.a.b.*导入的类将不包

python编辑器对比和推荐

python编辑器对比和推荐 我先给一个初步的表格吧,大家如果有什么意见,或有补充,欢迎提出.有些我没有用过,先不写了.以下是我使用过的python IDE: 除了PythonWin, VisualPython只支持Windows,其它都至少支持Win/Linux/Mac.各项含义:自动补全:变量/函数名打到一半时,提示可能的完整的变量/函数名.智能感知:在库/类/对象后打"."后,提示可能的函数或变量.调试:分四档,从好用到不好用分别为“类VC”(调试器操作方式与VC/eclipse

Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

继承(inheritance)背后的核心思想是:可以在现有类的基础上创建自己的新类,在新类中继承原来类的方法和数据域,并添加适合当前应用场景的新的数据和方法. 1. 类,超类,子类 (class,superclass,subclass): Java 中的inheritance都是public inheritance,并不想C++中存在public,protected和private inheritance的分类. class subclass extends superclass; 这里有两个要

java&amp;python使用对比的浅析

本人写了一段时间java了,最近半年在写python,遂想将其使用中的共同点和异同点整理出来,方便自己和大家学习. 两者的本质区别,请参考如下别人写的帖子: https://blog.csdn.net/sinat_30603081/article/details/78489261?locationNum=1&fps=1 https://blog.csdn.net/qq_17635843/article/details/77880694 本人不是特别清楚,只大概知道java 是强类型语言,pyth

ruby和Python简单对比

前不久学了ruby,发现ruby和Python非常像,于是自个测试对比了下,测完了才知道网上有现成的……下面是测试结果 序列(包括列表和元组等)有分片的特点:可能会比较方便的提取其中特定元素,暂时感觉没什么用:注意是用:分开两个数字.负号表示倒数第几个 留空表示开头或者结尾,python中的分片可以等距分割,格式是两个冒号 ruby则是[4...7]这样用两个或者三个句号分片,也可以用[1,2]这种逗号 不同的是,ruby似乎不能等距分割,而且ruby逗号方式下两个参数的意义是第一个是起始元素序