我解决了一个编程问题,如果有两个数字A和B,我必须在乘积的二进制形式中找到1的个数。A和B的范围是[0,10^9]包括在内。这是我写的代码。
public class Solution {
public static void main(String[] args) {
// System.out.println(solution(32329,4746475));
System.out.println(solution(3,4));
}
public static int solution(int A, int B) {
// write your code in Java SE 8
long mul=A*B;
int ans=0;
while(mul>0)
{
if((mul%2)!=0)
{
ans++;
}
mul=mul/2;
}
return ans;
}
}
这对输入(3,4)很有效,但当我尝试(323294746475)作为输入时,代码不起作用,结果显示0作为答案。我在不同的地方放了几个输出语句进行调试,发现有了这个输入,乘法的结果是-1170032381(这是错误的),因此while循环的条件失败。所以,我像这样对A和B进行了打字
long mul=(long)A*(long)B;
瞧,它起作用了。现在,我的问题是为什么?为什么代码对较小的输入运行良好,对较大的输入运行失败,并且在Java中不应该“int to long”是隐式类型转换?
(我还尝试了其他一些输入,因此并非所有较大的输入都给出负数作为乘积,但它们也没有给出正确的答案,较小的输入我一直尝试,直到5位a和B给出正确的乘积)
Java int可以从
-2147483648 to 2147483647
32329 X 4746475 =153448790275
由于Java在隐式转换之前进行乘法,结果是错误的
Java自动从int
扩展到long
,但这是在赋值时发生的,但是一个int
与另一个int
相乘会产生一个int
,所以你会得到整数溢出,首先将32329
与47464746475
相乘,然后将溢出的int
结果扩大到long
。
但是,如果您首先将至少一个int
转换为long
,那么乘法是使用long
完成的,结果是long
,因此不会出现整数溢出。
该方法通过用户的输入获取给定数据集中的两个最大整数,并计算它们的乘积。它对每个输入都很有效,直到我尝试了两个整数和的数组,它返回。 这是我的Java方法: 这是我的方法:
想象我们有两个数组: 获取包含两者相乘值的第三个String数组的更好方法是什么?比如: 我知道,我可以使用循环并将1中的每个元素与2中的每个元素连接起来,并将结果放入3中。但实际上和中的元素要多得多。Java中是否有专门的工具使其更有效?
有人请解释一下。为什么下面的程序产生16个?
问题内容: 我有一张桌子 提供值后,需要计算为 我想乘和列并将结果存储在同一表的列中。 我已经试过了: 但是失败了! 有人请帮助我实现这一目标。 问题答案: 尝试更新表格
我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘
问题内容: 我想长时间存储两个整数(而不是每次都必须创建一个新对象)。 目前,我已经尝试过了。它不起作用,但是我不知道这是怎么回事: 我得到这样的int值: 问题答案: 在第一个代码段中正进行符号扩展,这会在任何时候被覆盖。 在第二个代码段中,对的强制转换在转换之前完成,因此实际上获得的值。