枚举系列 除法 java版

本文介绍了一个数学问题的高效求解方法。题目要求找出所有形如abcde/fghij=n的表达式,其中a~j为0~9的排列。作者通过优化枚举算法减少重复检查,提高效率,并提供了具体的实现代码。

看了一题,题意是:
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2≤n≤79。
样例输入:
62
样例输出:
79546/01283=62
94736/01528=62


从输出上看,需要将0-9所以得数字进行组合,直到符合了我们的要求,便会打印出来,不难看出纯纯的枚举呀。。。
但是提到枚举就会想到暴力,鄙人不喜欢暴力,于是呢,我便尝试的去更改,使暴力最小化


说一下解题的思路:
创建一个判断方法,目的是排除相同的数字组合
但是在我知识的范围内呢,我只知道两个数字进行比较就是要搞上for一遍遍的循环,想想都难受
于是我就另寻它法,使用指针的形式,对两个数进行比较,这个能比之前快不少,,嘻嘻
首先
将两个数字的每一位都存入到数组中
使用for(指针)便利两个数的每一位
如果有相同的直接false,这样或许可以节约点时间,,嘻嘻


上代码:

public static boolean judge(int i, int j) { // 用数组t存放i,j的各位数字
        int[] t = new int[100]; 
        int ia = 0;
        while (i != 0) { // 取i中各位数字存放在数组t中
            t[ia++] = i % 10;
            i = i / 10;
        }
        while (j != 0) { // 取j中各位数字存放在数组t中
            t[ia++] = j % 10;
            j = j / 10;
        }
        // 判断a~j是否恰好为数字的0~9的一个排列
        for (int m = 0; m < 9; ++m)
            for (int n = m + 1; n < 10; ++n)
                if (t[n] == t[m])
                    return false;
        return true;
    }

总体代码:

import java.util.Scanner;
 class Main {
    public static boolean judge(int i, int j) { // 用数组t存放i,j的各位数字
        int[] t = new int[100]; 
        int ia = 0;
        while (i != 0) { // 取i中各位数字存放在数组t中
            t[ia++] = i % 10;
            i = i / 10;
        }
        while (j != 0) { // 取j中各位数字存放在数组t中
            t[ia++] = j % 10;
            j = j / 10;
        }
        // 判断a~j是否恰好为数字的0~9的一个排列
        for (int m = 0; m < 9; ++m)
            for (int n = m + 1; n < 10; ++n)
                if (t[n] == t[m])
                    return false;
        return true;
    }

    public static void main(String[] args) {
           Scanner sc = new Scanner(System.in);
           while(sc.hasNext()){
               int n = sc.nextInt();    
               for(int i = 1234; i <= 98765; i++){//i为除数
                   int dividend = i * n;//dividend被除数
                   if(dividend < 100000) { 
                       if(judge(dividend, i)) {//注意传参数!!!被除数,除数
                           System.out.printf(dividend+"/");
                           if(i < 10000)//若fghij<10000,(fghij代表四个数字)满足题目的条件,f位置输出0
                               System.out.printf("0");
                           System.out.println(i+ "=" + n);
                       }
                   }
               }
           }
    }
}

运行结果如下:
这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值