Java - 在同一步骤中获得商和余数?

Posted

技术标签:

【中文标题】Java - 在同一步骤中获得商和余数?【英文标题】:Java - get the quotient and remainder in the same step? 【发布时间】:2018-09-21 16:12:14 【问题描述】:

似乎为了在 Java 中找到除法的商和余数,必须这样做:

int a = ...
int b = ...

int quotient = a / b;
int remainder = a % b;

有没有办法这样写,以便在一个步骤中找到商和余数(一次除法运算)?或者 Java 是否已经自动优化了这段代码?

【问题讨论】:

你会如何在纸上进行一次操作? 不能在一行中给两个不同的变量赋值。 @Shark 在纸面上,长除法同时为您提供商和余数。有人告诉我,除法算法往往只提供其中一种。 @Shark 你可以在任何一步停止长除法。你知道5 进入11 两次。 2*5=1011-10=1=remainder. 在 Java 中没有办法做到这一点。当它得到 JIT 时,它可能会将其简化为单个 idiv 指令。您也可以使用 JNI,但最终可能会明显变慢。 【参考方案1】:

由于两者是不同的操作,因此无法一步完成。一个是除法,另一个是余数。因此,您需要两个变量来存储这两个操作的结果。

【讨论】:

但是计算机在进行除法时会找到余数,对吗?我想避免为了得到余数而进行二次除法。 @FuzzyCat444 “计算机在进行除法时会找到余数,对吗?” - 不,它找到商。余数是单独的指令。 @Strikegently 那完全回答了我的问题 @Strikegently 我在 Reinderien here 的一篇帖子中发现“通常,处理器上的模数和除法运算是同一回事。例如,请参阅 jsimlo.sk/docs/cpu/index.php/div.html。这是实现英特尔处理器上的除法指令。” 但是Java不能运行汇编,因为不同的处理器有不同的指令集。您也许可以在 C 中的内联 __asm 块中执行此操作,但不是 Java,而不会使事情变得过于复杂...通过编写必要的 C 代码,将其编译为共享库,加载库并调用必要的 JNI 指令来返回一个Pair<Integer, Integer>,其中包括商和余数。【参考方案2】:

所有体系结构的自然行为是除法指令在单独的寄存器(二进制)或存储区(IBM zSeries 上的压缩十进制)中提供商和余数。我所知道的唯一具有相同功能的高级语言是 COBOL。必须再次重复除法指令以获得余数似乎总是很浪费。

【讨论】:

【参考方案3】:

如果你需要这样做,

int a = ...
int b = ...

int quotient = a / b;
int remainder = b - (a * b);

使用的 CPU 稍微少一些,但除非您多次这样做,否则其中的 CPU 并不多。做 10 亿次第一次用时 5.3 秒,第二次用时 3.8 秒。在我的测试中也有一个 FOR 循环。

【讨论】:

【参考方案4】:
public int []result (int a , int b)
int quotient = a / b;
int remainder = a % b;
int [] array=new int[2];
array[0]=quotient;
array[1]=remainder;
return array;


public void main()

int a=..;
int b=...;

int [] results=result(a,b);

【讨论】:

如果你假装这是“一步”,那么它就是完美的解决方案! 这与 OP 想要避免的相同。两个操作,而不是一个。

以上是关于Java - 在同一步骤中获得商和余数?的主要内容,如果未能解决你的问题,请参考以下文章

使用循环和减法返回商和余数的除法?

定义 - 打印商和余数 - Python

Python中获取两数相除的商和余数

markdown 计算商和余数

编程中关于被除数,除数,商和余数的问题

C语言 输入两个整数,求出它们的商和余数