返回信息流118. Pascal's Triangle
List<List<Integer>> res=new ArrayList<List<Integer>>();
for (int row = 1; row <= numRows; row++) {
List<Integer>num=new ArrayList<Integer>();
long tem=row-1; //就是这个位置如果tem的格式用int,则输出的时候就会产生负数
num.add(1);
for(int i=2;i<=row;i++){
num.add( (int) tem);
tem=(int)( (tem*(i-1)*(row-i))/((i-1)*i));
}res.add(num);
}
return res;
因为tem的赋值只是int范围内的,所以刚开始设置int类型,结果就产生负数,换成long就可以了,求指导啊
这是一条镜像帖。来源:北邮人论坛 / java / #50747同步于 2016/5/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
leetcode easy 的118题Pascal's Triangle
hotpot
2016/5/29镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
对啊,就是这句在tem类型是int的时候i为11的时候就会溢出。但是我只是计算啊,赋值给tem的时候还是在int范围内的啊
【 在 ml3615556 的大作中提到: 】
: tem=(int)( (tem*(i-1)*(row-i))/((i-1)*i));
: 这一句在运算过程中overflow了
仔细看我的回复啊
运算过程中,知道什么叫“运算过程中”吗?
Integer.MAXVALUE * 100 / 100 的结果是啥?
【 在 hotpot 的大作中提到: 】
: 对啊,就是这句在tem类型是int的时候i为11的时候就会溢出。但是我只是计算啊,赋值给tem的时候还是在int范围内的啊
int的范围是闭区间[-2147483648, 2147483647]内的整数。如果溢出了,只有最后32比特会保留(负数使用“2的补码”表示法)。所以,
Integer.MAXVALUE*100/100
== 2147483647*100/100
== -100 / 100
== -1
这个-100就是2147483647*100 == 214748364700保留最后32位,按有符号整数解读得来,碰巧是-100。
是不是说因为前面要赋值给int类型,所以在计算的过程中任何一步都在一直在考虑是否超过int范围,如果是赋值给long类型,所以在计算的时候考虑的是long范围
【 在 ml3615556 的大作中提到: 】
: 仔细看我的回复啊
: 运算过程中,知道什么叫“运算过程中”吗?
:
: ...................
为啥你啥都会啊。。
【 在 nuanyangyang 的大作中提到: 】
: int的范围是闭区间[-2147483648, 2147483647]内的整数。如果溢出了,只有最后32比特会保留(负数使用“2的补码”表示法)。所以,
: Integer.MAXVALUE*100/100
: == 2147483647*100/100
: ...................
Not exactly
是你写的表达式只有int参与,而不是将结果给一个int
你试试乘以一个double 1?
【 在 hotpot 的大作中提到: 】
: 是不是说因为前面要赋值给int类型,所以在计算的过程中任何一步都在一直在考虑是否超过int范围,如果是赋值给long类型,所以在计算的时候考虑的是long范围
: 【 在 ml3615556 的大作中
: .........
哦,那就是说因为计算的时候等号右边的tem是int类型,所以等号右边整体是int类型,然后考虑每一步骤都是不能超过int范围,如果出现double或者long就认为整体是对应的类型,那这样理解对吗
【 在 ml3615556 的大作中提到: 】
: Not exactly
: 是你写的表达式只有int参与,而不是将结果给一个int
: 你试试乘以一个double 1?
: ...................