- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过重复加法将两个数字数组相乘。所以数字 324 = [4,2,3] 乘以 24 = [4,2]。我遇到的问题是迭代 324 和 324 的加法,将其作为 [8,4,6] 保存到数组中,然后重复加法过程以获得 [8,4,6]+[4,2,3] 等等等。这是我目前所拥有的:
BigInt result = new BigInt();
BigInt temp = new BigInt();
int sum = 0;
int carry = 0;
int size = digitList.size();
int k = 0; //k is our multiplier
for (int i = otherBigInt.digitList.size()-1; i >=0; i--) {
k = 10 * k + otherBigInt.digitList.get(i);
}
这是我逐位执行长加法的地方。
for (int i =0; i<size;i++) {
sum = digitList.get(i) + digitList.get(i) + carry;
if (sum > 9) {
temp.digitList.add(sum%10);
carry=1;
} else {
temp.digitList.add(sum);
carry=0;
}
if (sum > 9 && i == size-1) {
temp.digitList.add(sum/10);
}
}
这是我卡住的地方。我在这里要做的是将 324 添加到临时数组,然后将其答案分配给结果数组。从这里我将结果分配给临时数组,以便我可以添加到存储的结果中。 eg: digitlist = 324, temp = 324. Result = 648 --> digitList=324, temp = 648. result = 972.
我清除了结果数组,因此我可以在每次迭代中存储更新的结果。此时我得到一个 nullpointerExeption,其中 index = 0 且 size =0。
for(int i=0;i<25;i++) {
result.digitList.clear();
for (int j=0; j<digitList.size();j++) {
sum = digitList.get(j) + temp.digitList.get(j) + carry;
if (sum > 9) {
result.digitList.add(sum%10);
carry=1;
} else {
result.digitList.add(sum);
carry=0;
}
if (sum > 9 && j == size-1) {
result.digitList.add(sum/10);
}
}
temp.digitList = result.digitList;
}
return result;
}
这是一道家庭作业题,但我已经坚持了一段时间。对于这样一个简单的任务,我要找到的解决方案似乎太复杂了,有人可以引导我朝着正确的方向前进吗?
最佳答案
如果您使用其他变量名来帮助您,可能会更容易:
BigInt input1 = new BigInt();
BigInt multiplier = new BigInt();
BigInt nextResult = new BigInt();
BigInt lastResult = null;
while ( ... notdone ... ) {
nextResult.digitList.clear();
if (lastResult==null) {
lastResult = input1;
} else {
... the addition logic: nextResult = lastResult + input1 ...
}
... the logic to remember that one addition step was done ...
lastResult = nextResult;
nextResult = new BigInt();
}
lastResult
始终是上一次迭代的结果。您必须小心,不要更改 lastResult
中的数字。 lastResult
的唯一更改必须是,当您从 input1
或 nextResult
分配它时。
当您开始添加时,您的 lastResult
没有数据,因为没有“最后一次迭代”。在这种情况下,您只需使用 input1
初始化 lastResult
。
nextResult
是您在加法迭代中工作并将新数字存储到的地方。迭代完成后,将其设置为 lastResult
并准备一个新的 nextResult
以供处理。 (在您的代码中,您有时会使用 temp
,有时会使用 result
,这会增加您的困惑。)
有趣的是,记住你已经计算了多远。例如,在第一次迭代后使用“5 x 3”,您会得到一个结果,而“3”变为“2”,因为还剩下两次迭代。或者对于“123 x 15”,“15”随着每次迭代首先减少到“14”,然后是“13”,...“10”,“9”,... a.s.o.
这与 while 条件的“...未完成...”部分有关。
这里有几个可能的优化,我不想说太多,因为那肯定是你作业的一部分。也许您应该继续构建一些代码,直到它起作用。在此过程中,您可能已经有了如何让事情变得更容易的想法。如果您尝试在纸上执行添加步骤,它也可能会有所帮助。您可能会注意到哪些部分可以更轻松地完成。 (如果你没有找到优化,别担心 - 这需要练习,有时大脑处于这种情绪中,有时不是。而且你的结果必须是正确的,它们不应该被“巧妙地优化”然后有时是错误的。 )
更新:关于变量和对象实例
您需要区分变量和它们所引用的对象。
nextResult = new BigInt();
这条语句意味着两件事:1) 您创建了一个 BigInt()
的实例和 2) 您使用 lastResult
引用了那个 BigInt。
现在声明:
lastResult = nextResult;
仍然是相同的 BigInt
,但现在 lastResult
和 nextResult
都指的是相同的 BigInt
.如果您更改 lastResult
中的数字,您实际上更改了 BigInt
实例中的数字。由于 nextResult
和 lastResult
引用相同的 BigInt
,因此在获取数字时两者将提供相同的值。
这也意味着您不需要复制数字。他们已经在那里了。
现在这个语句创建了一个新的 BigInt
实例:
nextResult = new BigInt();
现在在这三个语句之后,nextResult
引用了一个新的 BigInt
实例,它现在不同于 中的
.BigInt
lastResult
关于java - 通过重复加法进行乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30431145/
如果矩阵A在X中,矩阵B在Y中。 进行乘法运算只是 Z = X*Y。正确假设两个数组的大小相同。 如何使用 for 循环计算它? 最佳答案 ja72 的anwser 是错误的,请查看我在其下的评论以了
我有一个 C 程序,它有 n 次乘法(单次乘法和 n 次迭代),我发现另一个逻辑有 n/2 次迭代(1 次乘法 + 2 次加法)。我知道两者都是 O(n) 的复杂性。但就 CPU 周期而言。哪个更快?
我有一个矩阵x: x <- matrix(1:8, nrow = 2, ncol = 4, byrow = 2) # [,1] [,2] [,3] [,4] #[1,] 1 2 3
我有一个矩阵x: x <- matrix(1:8, nrow = 2, ncol = 4, byrow = 2) # [,1] [,2] [,3] [,4] #[1,] 1 2 3
我正在创建一个基于电影 InTime 的 Minecraft 插件,并尝试创建代码,在玩家死亡时玩家将失去 25% 的时间。 当前代码是: String minus = itapi.getTimeSt
我正在尝试将 2 个矩阵与重载的 * 运算符相乘并打印结果。虽然看起来我不能为重载函数提供超过 1 个参数。如何将这两个矩阵传递给重载函数?请在下面查看我的实现。 #include #include
为什么在 Java 中使用 .*?例如 double probability = 1.*count/numdata; 给出相同的输出: double probability = count/numda
如果我尝试将两个值与单位相乘,则会出现意外错误。 $test: 10px; .testing{ width: $test * $test; } result: 100px*px isn't a v
我正在尝试计算库存中所有产品的总值(value)。表中的每种产品都有价格和数量。因此,我需要将每种产品的价格乘以数量,然后将所有这些加在一起以获得所有产品的总计。根据上一个问题,我现在可以使用 MyS
我正在尝试计算库存中所有产品的总值(value)。表中的每种产品都有价格和数量。因此,我需要将每种产品的价格乘以数量,然后将所有这些加在一起以获得所有产品的总计。根据上一个问题,我现在可以使用 MyS
大家好,我有以下代码行 solution first = mylist.remove((int)(Math.random() * mylist)); 这给了我一个错误说明 The operator *
我必须做很多乘法运算。如果我考虑效率,那么我应该使用位运算而不是常规的 * 运算吗?如果有差异如何进行位运算?提前致谢.. 最佳答案 不,您应该使用乘法运算符,让优化编译器决定如何最快地完成它。 您会
两个 n 位数字 A 和 B 的乘法可以理解为移位的总和: (A << i1) + (A << i2) + ... 其中 i1, i2, ... 是 B 中设置为 1 的位数。 现在让我们用 OR
我想使用 cuda 6 进行 bool 乘法,但我无法以正确的方式做到这一点。B 是一个 bool 对称矩阵,我必须进行 B^n bool 乘法。 我的 C++ 代码是: for (m=0; m
我正在编写一个定点类,但遇到了一些问题...乘法、除法部分,我不确定如何模拟。我对部门运算符(operator)进行了非常粗暴的尝试,但我确信这是错误的。到目前为止,它是这样的: class Fixe
我有TABLE_A我需要创建 TABLE_A_FINAL 规则: 在TABLE_A_FINAL中我们有包含 ID_C 的所有可能组合的行如果在 TABLE_A与 ID_C 的组合相同我们乘以 WEIG
这个问题在这里已经有了答案: Simple way to repeat a string (32 个答案) 关闭 6 年前。 我有一个任务是重复字符乘以它例如用户应该写重复输入 3 R 输出的字母和
我最近学习了C++的基础知识。我发现了一些我不明白的东西。这是让我有点困惑的程序。 #include using namespace std; int main()
我有两个列表: list_a = list_b = list(范围(2, 6)) final_list = [] 我想知道如何将两个列表中的所有值相乘。我希望我的 final_list 包含 [2*2
如何修改此代码以适用于任何基数? (二进制、十六进制、基数 10 等) int mult(int a, int b, int base){ if((a<=base)||(b<=base)){
我是一名优秀的程序员,十分优秀!