用java8求某个数的勾股数

8 篇文章 0 订阅
8 篇文章 0 订阅

最近在学习java 8 在书中有这样一个例子  给一个数在 100以内求他的勾股数:

也就是 sqrt(3*3+4*4)%1=0 那么这样就满足这样的条件 :

上代码 :

int a = 9;

//1..1000 里面有哪一个值可以满足 勾股
//返回一个数组 int  [a,b,c]
IntStream stream1 = IntStream.rangeClosed(1, 100)  //相当于切片一样  里面的元素是1-100
        .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0);

这里面的 rangeClosed(1,100) 的意思是int类型的stream 里面的元素是1-100

我们给他输出一下看一下结果:

stream1.forEach(System.out::print);

执行之后结果分别试12,  40  

也就是说, 9和12 和某个数满足条件,  9和40 和某个数满足这个条件 ,这才求出两个数了 那么另一个数呢?

我们需要返回一个数组 所以需要对上面的进行改进

返回一个数组 int  [a,b,c]

IntStream.rangeClosed(1, 100)  //相当于切片一样  里面的元素是1-100
        .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0).
        boxed().
        map(b -> new int[]{a, b, (int)Math.sqrt(a * a + b * b)})
        .forEach(r -> System.out.println("a=" + r[0] + ",c=" + r[1] + ",c=" + r[2]));

这里的boxed 是装箱的功能 这样就把 Intstream 转化成 Stream<Integer> 为甚吗装箱因为 装箱之后的map方法就可以操作了

输出结果看一下:

a=9,c=12,c=15

a=9,c=40,c=41

验证一下:

System.out.println(41*41);
System.out.println(9*9+40*40);
1681
1681

结果一样 这样我们一个数的勾股数也就都出来了

java 8非常 强大的

也可以这样写哦:

IntStream.rangeClosed(1, 100)
        .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0)
        .mapToObj(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)})
        .forEach(r -> System.out.println("a=" + r[0] + ",b=" + r[1] + ",c=" + r[2]));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值