全数字的乘积

如果一个n位数包含了1至n的所有数字恰好一次,我们称它为全数字的;例如,五位数15234就是1至5全数字的。

7254是一个特殊的乘积,因为在等式39 × 186 = 7254中,被乘数、乘数和乘积恰好是1至9全数字的。

找出所有被乘数、乘数和乘积恰好是1至9全数字的乘法等式,并求出这些等式中乘积的和。

注意:有些乘积可能从多个乘法等式中得到,但在求和的时候只计算一次。

package EULER32;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2016/11/10.
 * 思路:如果是1-9全数字只能:一位数*四位数=四位数,二位数*三位数=四位数
 * 根据乘积位数的限制,确定两个乘数的首位,在剩下的七个数里排序7*6*5种可能确定两个乘数,求出乘积判断是否为全数字
 * 桶排去重的话要1w次,用map的话满足条件的应该比100个少,map快一点
 * 其他时间复杂度较高但代码简单思路:列出1-9全部排列为9!按144判断一遍是否符合,按234判断一遍是否组合
 */
public class EULER32 {
    private static long start = System.currentTimeMillis();
    private static List<String> numList = new ArrayList<String>();
    static {
        numList.add(String.valueOf(1));
        numList.add(String.valueOf(2));
        numList.add(String.valueOf(3));
        numList.add(String.valueOf(4));
        numList.add(String.valueOf(5));
        numList.add(String.valueOf(6));
        numList.add(String.valueOf(7));
        numList.add(String.valueOf(8));
        numList.add(String.valueOf(9));
    }
    public static void main(String[] args){
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        int multiplier = 0;
        int product = 0;
        //一位数乘四位数
        for(int i=1;i<10;i++){//一位数i
            numList.remove(String.valueOf(i));
            for (int j=10/i;j>0;j--){//j为四位数的千位,当j>10/i,时,乘积为五位数,等于10/i也可能为五位数,在判断是否全数的逻辑控制
                if (i == j || j > 9)
                    continue;
                numList.remove(String.valueOf(j));
                for (int a=0;a<numList.size();a++){
                    int hundred = Integer.valueOf(numList.get(a));
                    numList.remove(a);
                    for (int b=0;b<numList.size();b++){
                        int ten = Integer.valueOf(numList.get(b));
                        numList.remove(b);
                        for (int c=0;c<numList.size();c++){
                            int one = Integer.valueOf(numList.get(c));
                            multiplier = j*1000+hundred*100+ten*10+one;
                            product = i*multiplier;
                            if (isPandigital(product,i,j,one,ten,hundred)){
                                map.put(product,1);
                                System.out.println(i + "*" + multiplier+"="+product);
                            }
                        }
                        numList.add(b,String.valueOf(ten));
                    }
                    numList.add(a,String.valueOf(hundred));
                }
                numList.add(String.valueOf(j));
            }
            numList.add(String.valueOf(i));
        }
        //二位数乘三位数
        for(int i=1;i<10;i++){//两位数的十位数i
            numList.remove(String.valueOf(i));
            for (int j=10/i;j>0;j--){//j为三位数的百位,当j>10/i,时,乘积不可能为四位数
                if (i == j || j > 9)
                    continue;
                numList.remove(String.valueOf(j));
                for (int a=0;a<numList.size();a++){
                    int one_i = Integer.valueOf(numList.get(a));
                    numList.remove(a);
                    for (int b=0;b<numList.size();b++){
                        int ten = Integer.valueOf(numList.get(b));
                        numList.remove(b);
                        for (int c=0;c<numList.size();c++){
                            int one = Integer.valueOf(numList.get(c));
                            multiplier = j*100+ten*10+one;
                            product = (i*10+one_i)*multiplier;
                            if (isPandigital(product,i,j,one,ten,one_i)){
                                map.put(product,1);
                                System.out.println(i*10+one_i + "*" + multiplier+"="+product);
                            }
                        }
                        numList.add(b,String.valueOf(ten));
                    }
                    numList.add(a,String.valueOf(one_i));
                }
                numList.add(String.valueOf(j));
            }
            numList.add(String.valueOf(i));
        }
        int totle = 0;
        for (Integer i:map.keySet()){
            totle += i;
        }
        System.out.println(totle);
        long end = System.currentTimeMillis();
        System.out.print("总用时:"+(end-start)+"毫秒");
    }

    public static boolean isPandigital(int num, int... var){
        if (num < 1000 || num > 9999)//乘积不是四位数
            return false;
        List<Integer> bitList = new ArrayList<Integer>();
        while (num > 0) {
            int bit = num%10;
            if (bit == 0)
                return false;
            for (int i = 0; i < bitList.size(); i++){
                if (bitList.get(i) == bit)
                    return false;
            }
            bitList.add(bit);
            for (int i = 0; i < var.length; i++) {
                if (var[i] == bit)
                    return false;
            }
            num /= 10;
        }
        return true;
    }
}
<think>嗯,用户想要计算任意个输入数字的乘积。那我得想想Python里怎么处理不定数量的输入。首先,可能需要用函数来接收多个参数,或者让用户输入一串数字然后用split处理。 比如说,使用*args来接收可变数量的参数,这样函数就可以处理任意个数的输入了。然后遍历这些参数,逐个相乘。或者用户可能通过输入函数输入用空格分隔的数字,这时候可以用split()分割成列表,再转换成浮点数或整数,然后计算乘积。 另外要注意的是,输入可能包含非数字字符,这时候需要异常处理,比如try-except块来捕捉ValueError。还有,如果用户没有输入任何数字,应该返回什么?可能需要提示错误或者返回0或1,但乘积的话,空的话应该是1,因为乘法的单位元是1。 然后,代码方面,可能有两种情况:一种是写一个函数,用*args收集参数,然后计算乘积;另一种是从用户输入中读取数据。比如,使用input函数获取输入,分割后处理。 比如,函数可以这样写: def multiply(*args): product = 1 for num in args: product *= num return product 但如果用户输入的是字符串,比如通过input输入的,那需要先转换成数值类型。比如: numbers = input("输入数字,空格分隔:").split() 然后转换为float或int,再相乘。 但这里可能有错误,比如用户输入了字母,这时候转换会出错,所以需要处理异常。 另外,如果用户没有输入任何数,比如split后的列表为空,这时候乘积应该是1,但可能用户期望的是提示输入错误。所以需要处理这种情况。 可能还需要考虑乘积的初始值为1,然后循环乘以每个数。 综上,可能的解决方法是: 1. 使用可变参数函数,处理任意数量的参数。 2. 从用户输入读取并处理,分割后转换。 3. 添加异常处理,确保输入都是数字。 4. 处理空输入的情况。 然后根据这些步骤写出代码,并解释每个部分的作用。</think><< 要计算任意个输入数字的乘积,可以通过以下两种方式实现: ```python # 方法1:使用可变位置参数(*args)接收数字 def calculate_product(*args): product = 1 for num in args: product *= num return product # 示例调用 print(calculate_product(2, 3, 4)) # 输出24 print(calculate_product(5, 10)) # 输出50 # 方法2:从用户输入获取多个数字 def input_product(): input_str = input("请输入数字(用空格分隔): ") numbers = [float(x) for x in input_str.split()] product = 1 for num in numbers: product *= num return product # 示例调用 print(input_product()) # 输入示例:"2 3 4" 输出24.0 ``` **实现原理:** 1. *args语法允许函数接收任意数量的位置参数,存储为元组 2. 初始乘积设为1(乘法单位元素) 3. 遍历所有参数/输入值进行累乘 4. 输入处理时将字符串分割后转换为浮点数,支持整数和小数输入 **注意事项:** - 需要处理非数字输入(可使用try-except) - 空输入时返回1(数学定义的零个因数的乘积) - 浮点数计算可能存在精度问题 **增强版(带异常处理):** ```python def safe_input_product(): while True: try: input_str = input("请输入数字(用空格分隔): ") if not input_str.strip(): return 1 numbers = [float(x) for x in input_str.split()] product = 1 for num in numbers: product *= num return product except ValueError: print("错误:请输入有效的数字!") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值