编程挑战(一)分数表示法

方法一:
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;
	}
}

 方法二: 
 
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编程挑战上提交代码总是报运行错误~~ 哭
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值