看了一题,题意是:
输入正整数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);
}
}
}
}
}
}
运行结果如下:

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

被折叠的 条评论
为什么被折叠?



