编程题

  1. 某人年龄的立方是4位数,年龄的四次方是6位数,这10位数包含0到9,每个恰好出现一次,求他年龄多大

public class One {
 public static void main(String[] args) {
     for (int i = 10; i < 100; i++) {
        int i1 = i*i*i;
        int i2 = i1*i;
        String s1 = i1+"";
        String s2 = i2+"";
        if(s1.length()==4&&s2.length()==6&&check(s1+s2)) {
            System.out.println(i);
            break;
        }
    } 
 }
//验证十位包含0到9
private static boolean check(String s) {
    //去重
    Set<Character> set = new HashSet<Character>();
    for(int i=0;i<s.length();i++) {
        set.add(s.charAt(i));
    }
    return set.size()==10;
}
}    

 

  2.  1 9 4 9四位数随意摆放它们的先后顺序,能组成多少个4位的素数

//重复数据的全排列+检查
public class One{

    static void f(int[] arr, int k) {
        if (k == 4)// 前面的已经确定,k为数组下标
            check(arr);
        for (int i = k; i < 4; i++) {
            // 交换
            int t = arr[k];
            arr[k] = arr[i];
            arr[i] = t;
            // 递归调用
            f(arr, k + 1);
            // 交换回来
            t = arr[k];
            arr[k] = arr[i];
            arr[i] = t;
        }
    }

    // 去重
    static Set<Integer> set = new HashSet<Integer>();

    // 验证十位数包含0到9
    private static void check(int[] arr) {
        // TODO Auto-generated method stub
        boolean flag = true;
        int x = arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
        for (int i = 2; i <= Math.sqrt(x); i++) {
            // 被二整除不是素数
            if (x % i == 0) {
                flag = false;
                break;
            }
        }
        // 素数添加到集合中
        if (flag) {
            set.add(x);
        }

    }

    public static void main(String[] args) {
        int arr[] = { 1, 9, 4, 9 };
        f(arr, 0);
        System.out.println(set.size());
    }

}
    

 

  3. 假设 a b c d e 代表1-9不同的5个数字(注意是各不相同的数字,且不含0),能满足 ab * cde = adb * ce 这样的算式一共多少种?

public class One {
    public static void main(String[] args) {
        int count = 0;
        //a,b,c,d,e都不等于零且它们不相等
        for (int a = 1; a < 10; a++) {
            for (int b = 1; b < 10; b++) {
                if (b != a) {
                    for (int c = 1; c < 10; c++) {
                        if (c != a && c != b) {
                            for (int d = 1; d < 10; d++) {
                                if (d != a && d != b && d != c) {
                                    for (int e = 1; e < 10; e++) {
                                        if (e != a && e != b && e != c && e != d) {
                                            if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b)
                                                    * (c * 10 + e)) {
                                                count++;
                                                System.out.printf(
                                                        "(%d*10+%d)*(%d*100+%d*10+%d)==(%d*100+%d*10+%d)*(%d*10+%d)==%d\n",
                                                        a, b, c, d, e, a, d, b, c, e,
                                                        (a * 100 + d * 10 + b) * (c * 10 + e));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(count);
    }
}

 

  4.三十九层台阶一共走偶数步,在只能迈上1个或2个台阶的条件下一共要多少种走法?

public class One5{
    public static void main(String[] args) {
        f(39,0);
        System.out.println(count);
    }
/**
 * 
 * @param i 剩下的台阶数
 * @param j 已走的台阶数
 */
    static int count;
    private static void f(int i, int j) {
        // TODO Auto-generated method stub
        if(i<0) {
            return;
        }
        if(i == 0) {//39层台阶全走完
            if(j%2==0) {
                count++;
            }
            return;
        }
        f(i-1,j+1);//一步走一个台阶
        f(i-2,j+1);//一步走两个台阶
        
    }
}

 

posted @ 2019-03-09 23:06  笺笙  阅读(257)  评论(0编辑  收藏  举报