2013年Java方向C组第三题

标题: 马虎的算式

小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

有一次,老师出的题目是:36 x 495 = ?,他却给抄成了:396 x 45 = ?

但结果却很戏剧性,他的答案竟然是对的!!因为 36 * 495 = 396 * 45 = 17820

类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

答案直接通过浏览器提交。

注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。

解析:

方案一:(循环嵌套法)

int count = 0;
for (int a = 1; a <= 9; a++) {
    for (int b = 1; b <= 9; b++) {
        if(b == a) continue;
        for (int c = 1; c <= 9; c++) {
            if(c == a || c == b) continue;
            for (int d = 1; d <=9; d++) {
                if(d == a || d == b || d == c) continue;
                for (int e = 1; e <= 9; e++) {
                    if(e == a || e == b || e == c || e == d) continue;
                    if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e))
                        count++;
                }
            }
        }
    }
}
System.out.println(count);
结果:142

方案二:(递归全排列)

先写出M个数取N个数全排列的框架:(如果M个数字中有重复数字,则在List集合中不存储具体数据,而存储下标,则可算出全排列的下标,然后根据下标得到全排列的数字)。

static int count = 0;
/**
 * 从m个元素中任取n个并对结果进行全排列
 * @param list   用于承载可能的排列情况的List
 * @param ints   总的整形数组,长度为m
 * @param n      从中取得字符个数
 */
public static void listAll(List<Integer> list, int[] ints, int n) 
{
    if (n == 0) {
        System.out.println(list);                   // 输出一种可能的排列
        count++;
        return;
    }
    for (int i = 0; i < ints.length; i++) {
        if(!list.contains(ints[i]))
        {
            list.set(list.size()-n, ints[i]);
        }
        else{   continue;   }
        listAll(list, ints, n - 1);                // 下一位
        list.set(list.size() - n, -1);             // 还原            
    }
}
public static void main(String[] args) {
    //  以字符数组承载总的字符集合
    int[] ints = {1,2,3,4,5};
    int n = 3; //n=3则是取3个数
    List<Integer> intList = new ArrayList<Integer>();
    //通过这一步初始化序列的长度(i<3则是取三个数)
    for (int i = 0; i < n; i++) {
        intList.add(-1);
    }
    listAll(intList, ints, n); 
    System.out.println(count);
}

然后在以上框架基础上,在n==0的判断中去加工:

static int count = 0;
public static void listAll(List<Integer> list, int[] ints, int n) 
{
    if (n == 0) {
        //System.out.println(list);                   // 输出一种可能的排列
        int a = list.get(0); int b=list.get(1); int c=list.get(2); int d=list.get(3); int e=list.get(4);
        if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e))
            count++;
        return;
    }
    for (int i = 0; i < ints.length; i++) {
        if(!list.contains(ints[i]))
        {
            list.set(list.size()-n, ints[i]);
        }
        else{   continue;   }
        listAll(list, ints, n - 1);                // 下一位
        list.set(list.size() - n, -1);             // 还原            
    }
}
public static void main(String[] args) {
    //  以字符数组承载总的字符集合
    int[] ints = {1,2,3,4,5,6,7,8,9};
    int n = 5; //n=3则是取3个数
    List<Integer> intList = new ArrayList<Integer>();
    //通过这一步初始化序列的长度(i<3则是取三个数)
    for (int i = 0; i < n; i++) {
        intList.add(-1);
    }
    listAll(intList, ints, n); 
    System.out.println(count);
}

扩展:M个数字取N个数字全排列(如果M个数字中有数字重复)的模板

如果M个数字中有重复数字,则在List集合中不存储具体数据,而存储下标,则可算出全排列的下标,然后根据下标得到全排列的数字。

static Set<String> set = new HashSet<String>();
public static void main(String[] args) {
    int[] ints = {1,2,2,4,5};
    int n = 3; //取三个数字
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < n; i++) 
        list.add(-1);
    listAll(list,ints,n);
    System.out.println(set);
    System.out.println(set.size());
}
public static void listAll(List<Integer> list,int[] ints,int n)
{
    if(n == 0) //其中一种排列方式完成
    {
        String r = ints[list.get(0)]+""+ints[list.get(1)]+""+ints[list.get(2)];
        set.add(r);
        return;
    }
    for (int i = 0; i < ints.length; i++) {
        if(!list.contains(i))
            list.set(list.size()-n, i);
        else
            continue;
        listAll(list,ints,n-1);
        list.set(list.size()-n, -1);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355