题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小明的作业本上有道思考题:
看下面的算式:
(□□□□-□□□□)*□□=900
copy
其中的小方块代表 00 ~ 99 的数字,这 1010 个方块刚好包含了 00 ~ 99 中的所有数字。 注意:00 不能作为某个数字的首位。
小明经过几天的努力,终于做出了答案!如下:
(5012-4987)*36=900
copy
用计算机搜索后,发现还有另外一个解,本题的任务就是:请你算出这另外的一个解。
注意:输出格式需要与示例严格一致; 括号及运算符号不要用中文输入法; 整个算式中不能包含空格。
运行限制
最大运行时间:1s
最大运行内存: 128M
思路:
1.找出后两位空格数,就是900大于等于10小于等于100的约数
2.设第一个数为i,第二个为j,第三个为k,
1000<i<10000,由于k的值最小为10,所以i-j最大为90,最小为10,所以
i-90<=j<=i-10,当i==5012跳过
3.将k约数求出,将三个数逐个拆分放入set集合,判断set的大小为10说明没有重复,符合条件,否则set集合清空继续.
ps:本题虽然简单,并且是填空题,但是缩小查找范围,减少时间复杂度的思想还是值得学习,如果数据量过大,循环次数过10亿很有可超时,也不能无视判断,计算的时间.
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = 900;
List<Integer> list = new ArrayList<>();
//求出90的约数
for (int i = 10; i < 100; i++) {
if (n % i == 0) {
list.add(i);//90的约数k
}
}
//将数字存入set集合去重复
Set set = new HashSet();
int mod = 0, ri = 0, rj = 0, rm = 0;
f: //跳出循环标志
for (int i = 1000; i < 10000; i++) {
if(i==5012) continue ;
for (int j = i - 90; j <= i - 10; j++) {
int y = j, x = i;//将值赋值中间变量用来逐个拆分放进set集合
for (int m = 0; m < list.size(); m++) {
int k = list.get(m);
if( (i - j) * list.get(m) == n ) {
while (x != 0) {//拆分第一个数字
mod = x % 10;
x = x / 10;
set.add(mod);
}
while (y != 0) {//拆分第二个数字
mod = y % 10;
y = y / 10;
set.add(mod);
}
while (k != 0) {//拆分第三个数字
mod = k % 10;
k = k / 10;
set.add(mod);
}
//判断长度等于10说明没有重复数组,符合条件
if (set.size() == 10) {
ri = i;
rj = j;
rm = list.get(m);
break f;
} else {
set.clear();//清空set集合
}
}
}
}
}
System.out.println("(" + ri + "-" + rj + ")*" + rm + "=" + n);
scan.close();
}
}