如何在不使用控制语句或循环的情况下将整数中的所有数字相乘(不包括 000 到 1000 之间)?



我正在尝试编写一个程序,该程序可以仅使用Java中的数学表达式将数字的所有数字从0以独占方式相乘到1000。只要用户输入一个3位数,我的程序就可以正常工作,但如果用户输入的数字小于100,则结果为0。

我尝试过用"%10"获取输入的最后一位,并用"/10"删除最后一位数字,但没有控制语句来检测输入是否已减为零,当一个2位数减为零时,程序最终会乘以0,从而给出不正确的结果。

public class MultiplyDigits {
public static void main(String[] args){
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("Enter a number between 0 and 1000: ");
int number = input.nextInt();
int product = 1;
product*=number%10;
number/=10;
product*=number%10;
number/=10;
product*=number%10;
System.out.println(product);
}
}

输入55应该会得到25,但我的程序会得到5 x 5 x 0=0

999的输入结果为729,这是正确的。9 x 9 x 9=729

再澄清一下,这是一个完全新手课本第二章中的问题。作者没有涉及选择语句、循环、编写我们自己的方法或类,或者任何比初等编程更高级的东西,所以这意味着没有这些都是可行的。虽然作者只提到了Math和System类中的方法,但本书已经介绍了在Java中内置的类中调用方法。例如,Math.max()、Math.min()、Math.pow()、System.currentTimeMillis();

这个变体怎么样。要找到第一个数字,您可以首先将输入的数字减少100,然后加1以避免在多重作用期间为0。而且,正如NVioli建议的那样,第二个数字应该是相同的,更新后可以输入低于10的数字。因此,最后的变体是:

int number = input.nextInt();
int t1 = 1 + (number-100) / 100;
int t2 = (1 + (number-10) / 10) % 10; \By NVioli
int t3 = number % 10;
int  product = t1 * t2 * t3;
System.out.println(product);

第一部分是将基本代码提取到一个单独的Java方法中。我称它为dprod,它是"数字乘积"的缩写。

static int dprod(int x) {
int hun = x / 100 % 10;
int ten = x / 10 % 10;
int one = x / 1 % 10;
return hun * ten * one;
}

上面的代码是仅适用于数字>= 100的天真版本。

要按预期处理小于100的数字,如果hunten为0,则需要将其替换为1。

static int dprod(int x) {
int hun = x < 100 ? 1 : x / 100 % 10;
int ten = x < 10 ? 1 : x / 10 % 10;
int one = x / 1 % 10;
return hun * ten * one;
}

?:运算符被称为条件运算符,因此在您的规则中可能不允许使用它。有一种可能的解决方法,即使用?:运算符而不显式写入,使用Math.max函数。

static int dprod(int x) {
int hun = Math.max(100, x) / 100 % 10;
int ten = Math.max(10, x) / 10 % 10;
int one = x / 1 % 10;
return hun * ten * one;
}

Math.max函数在内部使用?:运算符,因此它也可能被禁止。不过,这有待讨论,因为这取决于规则的确切措辞及其意图。

如果Math.max被禁止,则可以在没有分支或条件的情况下完全实现它,请参阅这个C++问题,可以通过用int替换int32和用static替换inline将其转换为Java。

完整的代码,包括自动测试,是:

package de.roland_illig.so;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
public class DprodTest {
static int dprod(int x) {
int hun = Math.max(x, 100) / 100 % 10;
int ten = Math.max(x, 10) / 10 % 10;
int one = x / 1 % 10;
return hun * ten * one;
}
@Test
public void testDprod() {
assertThat(dprod(999)).isEqualTo(729);
assertThat(dprod(123)).isEqualTo(6);
assertThat(dprod(99)).isEqualTo(81);
assertThat(dprod(9)).isEqualTo(9);
}
}

您只需用长度为1000的数组初始化程序,用每个数字的值初始化它,然后您的实际问题简化为:

System.out.println(calculatedArray[number]);

您的初始化甚至可以利用这样一个事实,即根据您的规则,领先的0并不重要(55和155是相同的结果。)

calculatedArray[55] = calculcate(155);

有一些方法可以帮助您,但所有方法都有一个简单的循环,或者如果:

  1. 您可以使用digits = Logarithm of your number(10 base),然后您有位数,然后您可以使用循环来计算结果。你的循环将被重复digit次,所以无论你的号码有多少位数,它都会一直工作。

  2. 你可以检查你的数字是否小于100,然后把100加到上面,然后计算结果,因为1 * digit1 * digit2不会有错误。

最新更新