4.10 数字哑谜和回文

4.10 数字哑谜和回文

基本问题

基本问题1:找出符合条件的九位数,每位数互不相同(1~9的某个排列),满足高n位能被n整除。例如abcdefghi,高两位ab能被2整除,高三位abc能被3整除,以此类推。

解法

  • 解法1 :穷举9^9,然后使用剪枝避免不必要的运算。
  • 解法2:逻辑推理
    a 可取1~9任何数
    b 可取2 4 6 8
    c 符合(a+b+c)能被3整除
    d 可取2 4 6 8 且 cd能被4整除
    e 可取5
    f 可取2 4 6 8 且符合(a+b+c+d+e+f)被3整除
    g 符合(abcd-efg)能被7整除
    h 可取2 4 6 8 且符合(fgh)能被8整除
    i 符合(a+b+c+d+e+f+g+h+i)被9整除
    。。。。

answer : 381654729

基本问题2:人过大佛寺 * 我 =寺佛大过人 ,每个中文代表各不相同的0~9的数字。求出这个五位数

解法:采用枚举的方式,详情见代码。

拓展问题

拓展问题1:N位回文数有多少个呢?

暴力枚举

拓展问题2:(he)平方=(she),求s,h,e的值

e是末尾数字,由题意可知e的平方的末尾数字为e所以e的可能值为0,1,5,6,其中0不可能,否则she的末两位为00(比如20的平方为400),而h与e是不同的数剩下的事就是将其代入1,若e为1,则he为21,31,(he为41,he的平方为四位数...

\[s:6, h:2 ,e:5 \]

\[25*25=625 \]

All Coding

import java.util.Arrays;
//大致思路: 通过穷举五位数,找出一个数,如果这个数字能整除它的回文数,并且结果所得的数字和这个数不相同,也就是说总共有6个 0~9的数字。
 
public class huiwen {
 
	public static void main(String[] args) {
		printAll();
	}
	private static void printAll() {
                //用来保存乘数的数组
		boolean flag = true;
		boolean IsUsed[] = new boolean[10];    
		int number, revert_number, temp, v = 0;
		for (number = 12345; number < 100000; number++) {
			flag = true;
			Arrays.fill(IsUsed, false);     
			temp = number;
			revert_number = 0;
			for (int i = 0; i < 5 && flag == true; i++) {
				v = temp % 10;
				revert_number = revert_number * 10 + v;
				temp /= 10;
				if (IsUsed[v]) {
					flag = false;
					// break;  通过循环条件增加 flag==true 来取消 break 语句
				} else {
					IsUsed[v] = true;
				}
			}
			if (flag == true && (revert_number % number == 0)) {
				v = revert_number / number;
				if (v < 10 && IsUsed[v] == false) {//只有该乘数不包含在五位数之内才合法
					System.out.print("the result is: " + number + " * " + v + " = " + revert_number);
				}
			}
		}
	}
}


posted @ 2020-12-01 13:45  BOTAK  阅读(184)  评论(0编辑  收藏  举报