这篇文章讲述的是算法趣味整数部分的勾股数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
求100以内的所有勾股数,所谓勾股数,是指能够构成直角三角形三边的整数(a,b,c),即满足a*a+b*b=c*c
算法分析
穷举法使用三个循环确定a,b,c的值,再判断条件即可
代码实现
package funnyInteger;
/**
* @author 叶清逸
* @date 2018年7月14日下午8:47:25
* @version 1.0
* @project funnyInteger
*/
public class Q9_PythagoreanNumber {
/**
* 问题分析:求100以内的所有勾股数,所谓勾股数,是指能够构成直角三角形三边的整数
* (a,b,c),即满足a*a+b*b=c*c
*
* 算法分析:穷举法使用三个循环确定a,b,c的值,再判断条件即可
*/
public static void main(String[] args) {
method1() ;
//method2() ;
}
/*方法一:穷举法,时间复杂度为O(n*n*n)*/
private static void method1(){
/*使用n变量统计结果个数*/
int n = 1 ;
System.out.println("100以内的勾股数如下:");
/*定义三层循环确定a,b,c的值*/
for(int a=1 ; a<=100 ; a++)
for(int b=a+1 ; b<=100 ; b++)
for(int c=b+1 ; c<=100 ;c++){
/*判断条件*/
if(a*a+b*b==c*c){
System.out.printf("%-3d %-3d %-3d ",a,b,c);
/*方便观察结果,每4个换行*/
if(n%4 == 0 )
System.out.println();
n++ ;
}
}
System.out.println("共"+n+"个");
}
/*方法二:穷举法,时间复杂度为O(n*n)*/
private static void method2(){
/*使用n变量统计结果个数*/
int n = 1 ;
System.out.println("100以内的勾股数如下:");
/*定义三层循环确定a,b,c的值*/
for(int a=1 ; a<=100 ; a++)
for(int b=a+1 ; b<=100 ; b++){
int c = (int)Math.sqrt(a*a+b*b) ;
/*判断条件*/
if(a*a+b*b==c*c && a+b>c && a+c>b && c<=100){
System.out.printf("%-3d %-3d %-3d ",a,b,c);
/*方便观察结果,每4个换行*/
if(n%4 == 0 )
System.out.println();
n++ ;
}
}
System.out.println("共"+n+"个");
}
}
样例输出
100以内的勾股数如下:
3 4 5 5 12 13 6 8 10 7 24 25
8 15 17 9 12 15 9 40 41 10 24 26
11 60 61 12 16 20 12 35 37 13 84 85
14 48 50 15 20 25 15 36 39 16 30 34
16 63 65 18 24 30 18 80 82 20 21 29
20 48 52 21 28 35 21 72 75 24 32 40
24 45 51 24 70 74 25 60 65 27 36 45
28 45 53 28 96 100 30 40 50 30 72 78
32 60 68 33 44 55 33 56 65 35 84 91
36 48 60 36 77 85 39 52 65 39 80 89
40 42 58 40 75 85 42 56 70 45 60 75
48 55 73 48 64 80 51 68 85 54 72 90
57 76 95 60 63 87 60 80 100 65 72 97
共53个