方法一:
import java.io.IOException;
import java.util.Scanner;
/*
* b = a + c / d
* 0 < b < 65535
* 思路:缩小范围后穷举。缩小范围:0 < a < b-1;c > d,d的位数最大为(9 - a.length)/2。
*/
public class FractionEquation {
public static void main(String[] args) throws IOException {
Scanner is = new Scanner(System.in);
int i = is.nextInt();
if (i <= 0) {
System.out.println("输入非法!");
return;
}
int[] k = new int[i];
for (int j = i - 1; j >= 0; j--) {
Scanner ks = new Scanner(System.in);
k[j] = ks.nextInt();
if (k[j] <= 0 || k[j] >= 65535) {
System.out.println("输入非法!");
return;
}
}
for (int p = i - 1; p >= 0; p--) {
int n = findEquation(k[p]);
System.out.println(n);
}
}
// 查找符合条件的等式
private static int findEquation(int b) {
int x = 0;
for (int i = 1; i < b - 1; i++) {
int a = i;
if (!isRepeat(a) && !contain(a, 0)) {
// d < c,所以d的最大长度为(c.length + d.length)/2
int l = (9 - Integer.toString(a).length()) / 2;
for (int j = 1; j < Math.pow(10, l); j++) {
int d = j;
if (!isRepeat(d) && !contain(d, 0) && !contain(d, a)) {
int c = (b - a) * d;
if (Integer.toString(c).length()
+ Integer.toString(d).length()
+ Integer.toString(a).length() == 9) {
if (!isRepeat(c) && !contain(c, 0)
&& !contain(c, a) && !contain(c, d)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
}
return x;
}
// 判断整数j中是否有重复的数字
private static boolean isRepeat(int j) {
String s = Integer.toString(j);
for (int i = 0; i < s.length(); i++) {
String m = s.substring(0, i) + "n" + s.substring(i + 1);
if (m.contains("" + s.charAt(i))) {
return true;
}
}
return false;
}
// 判断整数j中是否包含整数a的数字
private static boolean contain(int j, int a) {
String sj = Integer.toString(j);
String sa = Integer.toString(a);
for (int i = 0; i < sa.length(); i++) {
if (sj.contains("" + sa.charAt(i)))
return true;
}
return false;
}
}
方法二:
两种方法都能在Eclipse上正确编译运行,得到正确结果,但不知道为什么在CSDN编程挑战上提交代码总是报运行错误~~
import java.io.IOException;
import java.util.Scanner;
/*
* b = a + c / d
* 0 < b < 65535
* 思路:根据b的位数分析a和c/d可能的位数,根据c/d的位数分析c和d的位数,分多种情况穷举。
*/
public class ShowEquation {
public static void main(String[] args) throws IOException {
Scanner is = new Scanner(System.in);
int i = is.nextInt();
if (i <= 0) {
System.out.println("输入非法!");
return;
}
int[] k = new int[i];
for (int j = i - 1; j >= 0; j--) {
Scanner ks = new Scanner(System.in);
k[j] = ks.nextInt();
if (k[j] <= 0 || k[j] >= 65535) {
System.out.println("输入非法!");
return;
}
}
for (int p = i - 1; p >= 0; p--) {
int n = findEquation(k[p]);
System.out.println(n);
}
}
// 查找符号添加的等式
private static int findEquation(int b) {
int x = 0;
int a;
int c;
int d;
if (Integer.toString(b).length() == 1) {
// b为1位数:a为1位数, c/d为1位数,c、d均为4位数,0 < a < b-1
for (int i = 1; i < b - 1; i++) {
a = i;
for (int j = 1000; j < 10000; j++) {
// 判断j是否自身重复,是否包含数字a,除去自身有重复数字和包含数字a的部分
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
// 假设j为d,c = (b - a) * d;
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
} else if (Integer.toString(b).length() == 2) {
// b为2位数:a为1位数或2位数,c/d为1位数或2位数
for (int i = 1; i < 10; i++) {
// a为1位,不可能重复,c/d为1位数或2位数,c and d
// 8位,d最大长度为4,最大为9999,d最小长度为3,最小为100
a = i;
// d为4位,c为4位
for (int j = 1000; j < 10000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
// d为3位,c为5位
for (int j = 100; j < 1000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
for (int i = 10; i < b - 1; i++) {
// a为2位数,c/d为1位数或2位数,c and d 7位,d最大3位,最大999,最小3位,最小100,c为4位
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
for (int j = 100; j < 1000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
} else if (Integer.toString(b).length() == 3) {
// b为3位数:a可以为1,2,3位数
for (int i = 1; i < 10; i++) {
// a为1位数,c/d为2位数或3位数,c and d 8位数,c为5位数,d为3位数
a = i;
for (int j = 100; j < 1000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
for (int i = 10; i < 100; i++) {
// a为2位数,c/d为1位数或2位数或3位数,c and d 7位数,d为2位数或3位数,c为4位数或5位数
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// d为2位,c为5位
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为3位,c为4位
for (int j = 100; j < 1000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
for (int i = 100; i < b - 1; i++) {
// a为3位数,c/d为1位数或2位数或3位数,c and d 6位数,d为2或3,c为4或3
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// d为2位数,c为4位数
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为3位,c为3位
for (int j = 100; j < 1000; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100 && c < 1000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
} else if (Integer.toString(b).length() == 4) {
// b为4位数,a为1、2、3、4位数
// a为1位数,c/d为3、4位数
for (int i = 1; i < 10; i++) {
a = i;
// c and d 8位数
for (int j = 100; j < 1000; j++) { // 5 3
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
for (int j = 10; j < 100; j++) { // 6 2
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100000 && c < 1000000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
// a为2位数,c/d为3、4位数
for (int i = 10; i < 100; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 7位数
for (int j = 10; j < 100; j++) { // 5 2
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
// a为3位数,c/d为1、2、3、4位数
for (int i = 100; i < 1000; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 6位数
for (int j = 100; j < 1000; j++) { // 3 3
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100 && c < 1000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
for (int j = 10; j < 100; j++) { // 4 2
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
for (int j = 1; j < 10; j++) { // 5 1
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
// a为4位数,c/d为1、2、3、4位数
for (int i = 1000; i < b - 1; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 5位数,d为1或2
// d为1,c为4
for (int j = 1; j < 10; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为2,c为3
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
} else if (Integer.toString(b).length() == 5) {
// b为5位数
for (int i = 1; i < 10; i++) {
a = i;
// c and d 8位数,c/d为4、5位数
// d为2,c为6
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100000 && c < 1000000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + " + c
// + " / " + d);
}
}
}
}
}
// a为2位数,c/d为4、5位数
for (int i = 10; i < 100; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 7位数
// d为2,c为5
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为1,c为6
for (int j = 1; j < 10; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100000 && c < 1000000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
// a为3位数,c/d为4、5位数
for (int i = 100; i < 1000; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 6位数
// d为1,c为5
for (int j = 1; j < 10; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10000 && c < 100000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
// a为4位数,c/d为1、2、3、4、5位数
for (int i = 1000; i < 10000; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 5位数,d最大为2,最小为1
// d为2,c为3
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100 && c < 1000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为1,c为4
for (int j = 1; j < 10; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 1000 && c < 10000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
// a为5位数,c/d为1、2、3、4、5位数
for (int i = 10000; i < b - 1; i++) {
if (!isRepeat(i) && !contain(i, 0)) {
a = i;
// c and d 4位数,d最大2位,最小为1
// d为2位,c为2位
for (int j = 10; j < 100; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 10 && c < 100) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
// d为1位,c为3位
for (int j = 1; j < 10; j++) {
if (!isRepeat(j) && !contain(j, a) && !contain(j, 0)) {
d = j;
c = (b - a) * d;
if (c > 100 && c < 1000) {
if (!isRepeat(c) && !contain(c, a)
&& !contain(c, d) && !contain(c, 0)) {
x += 1;
// System.out.println(b + " = " + a + " + "
// + c + " / " + d);
}
}
}
}
}
}
}
return x;
}
// 判断整数j中是否有重复的数字
private static boolean isRepeat(int j) {
String s = Integer.toString(j);
for (int i = 0; i < s.length(); i++) {
String m = s.substring(0, i) + "n" + s.substring(i + 1);
if (m.contains("" + s.charAt(i))) {
return true;
}
}
return false;
}
// 判断整数j中是否包含整数a的数字
private static boolean contain(int j, int a) {
String sj = Integer.toString(j);
String sa = Integer.toString(a);
for (int i = 0; i < sa.length(); i++) {
if (sj.contains("" + sa.charAt(i)))
return true;
}
return false;
}
}
两种方法都能在Eclipse上正确编译运行,得到正确结果,但不知道为什么在CSDN编程挑战上提交代码总是报运行错误~~