如何在不使用控制语句或循环的情况下,将所有数字乘以一个整数(介于000和1000之间,不包括在内)?

时间:2019-02-06 18:02:56

标签: java

我正在尝试编写一个程序,该程序可以仅使用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

需要更多说明,这是针对新手的教科书第二章中的问题。作者没有涉及选择语句,循环,编写我们自己的方法或类或比基本编程更高级的内容,因此,这意味着没有这些内容就可以实现。本书涵盖了Java内置类中的调用方法,尽管作者仅提到了Math和System类中的方法。例如,Math.max(),Math.min(),Math.pow(),System.currentTimeMillis();

4 个答案:

答案 0 :(得分:3)

这个变体呢?要查找第一个数字,您可以首先将输入的数字减少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);

答案 1 :(得分:0)

第一部分是将基本代码提取到单独的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替换为1(如果为0)。

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,则可以完全没有分支或条件地实现它,请参见this C++ question,可以通过将int32替换为int将其翻译成Java。并将inline替换为static

包括自动测试在内的完整代码为:

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);
    }
}

答案 2 :(得分:0)

您可以使用长度为1000的数组初始化程序,并使用每个数字的值对其进行初始化,然后您的实际问题将简化为:

if (activated !== 0)

您的初始化甚至可以利用以下事实:根据您的规则,前导0无关紧要(55和155是相同的结果。)

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

答案 3 :(得分:-1)

有些方法可以为您提供帮助,但所有方法都有一个简单的循环,或者是否存在:

  1. 可以使用let slideMenuController = SlideMenuController(mainViewController:nvc, leftMenuViewController: UINavigationController(rootViewController: leftViewController), rightMenuViewController: rightViewController) ,然后输入位数,然后可以使用循环来计算结果。您的循环将重复digits = Logarithm of your number(10 base)次,因此无论您的号码有多少位数字,它都将始终有效。

  2. 您可以检查您的电话号码是否小于100,然后向其添加digit,然后计算结果,因为100不会有错误。