我正在尝试编写一个程序,该程序可以仅使用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的数字,如果hun
或ten
为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);
有一些方法可以帮助您,但所有方法都有一个简单的循环,或者如果:
-
您可以使用
digits = Logarithm of your number(10 base)
,然后您有位数,然后您可以使用循环来计算结果。你的循环将被重复digit
次,所以无论你的号码有多少位数,它都会一直工作。 -
你可以检查你的数字是否小于100,然后把
100
加到上面,然后计算结果,因为1 * digit1 * digit2
不会有错误。