Java 032. 全数字乘积

全数字乘积
如果一个 n 位数使用了 1 到 n 中每个数字且只使用了一次,我们称其为全数字。例如,
15234 这个五位数,是 1 到 5 全数字的。
7254 是一个不寻常的数,因为:39 × 186 = 7254 这个算式的乘数,被乘数和乘积组成了
一个 1 到 9 的全数字组合。
找出所有能够组合成 1 到 9 全数字的乘法算式中乘积的和。
提示: 有的乘积数字能够被多个乘法算式得到,所以在计算时要记得只计算它们一次。
答案:45228
可能的情况:一位乘以四位等于四位,二位乘以三位等于四位
代码如下:

static int[]a=new int[10000];
    public static int add(){
        int t=0,m;
        for(int i=2;i<=9;i++){
            for(int j=1000;j<=9999;j++){
                if(j%10==i||j/10%10==i||j/100%10==i||j/1000%10==i)
                    continue;
                else {
                    m=i*j;
                    if(judge(i,j,m)&&a[m]!=-1){
                        t+=m;
                        a[m]=-1;
                        System.out.println(i+" "+j+" "+m);
                    }
                }
            }
        }
        for(int i=10;i<=99;i++)
            for(int j=100;j<=999;j++){
                String s1=Integer.toString(i),s2=Integer.toString(j);
                String s=s1+s2;
                Set<Character> set = new HashSet<Character>();
                char[] chars = s.toCharArray();
                for(char c:chars) {
                    set.add(c);
                }
                if(s.length()!= set.size()) continue;
                m=i*j;
                if(judge(i,j,m)&&a[m]!=-1){
                    t+=m;
                    a[m]=-1;
                    System.out.println(i+" "+j+" "+m);
                }
            }
        return t;
    }
    public static boolean judge(int i,int j,int m){
        String s1=Integer.toString(i),s2=Integer.toString(j),s3=Integer.toString(m);
        String s=s1+s2+s3;
        if(s.length()!=9) return false;
        Set<Character> set = new HashSet<Character>();
        char[] chars = s.toCharArray();
        for(char c:chars) {
            if(c=='0') return false;
            set.add(c);
        }
        return (set.size()==s.length());
    }
    public static void main(String[] args) {
        System.out.println(add());
    }

程序运行结果:
在这里插入图片描述
可参考代码:

import java.util.Arrays;
public class p032 {
 public String run() {
 int sum = 0;
 for (int z = 1; z < 10000; z++) {
 if (hasPandigitalProduct(z))
 sum += z;
 }
 return Integer.toString(sum);
 }
 private static boolean hasPandigitalProduct(int z) {
 for (int x = 1; x <= z; x++) {
 //先找到 z 的所有因子 x,把 x,z/x(即 y),z 连接起来进行判断,如果是全数字乘积则 true
 if (z % x == 0 && isPandigital("" + x + z/x + z))
 return true;
 }
 return false;
 }
 //判断字符串 s 是否是全数字串(思路:先转化为字符数组,然后排序,再恢复成串,和"123456789"进
行比较即可)
 private static boolean isPandigital(String s) {
 if (s.length() != 9)
 return false;
 char[] temp = s.toCharArray();
 Arrays.sort(temp); //字符数组从小到大排序
 return new String(temp).equals("123456789");
 }
 public static void main(String[] args) {
 System.out.println(new p032().run());
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值