越南三年级数学题

来源:互联网 发布:环形变压器计算软件 编辑:程序博客网 时间:2024/06/09 23:00

      网上的 题目是这样的:

           

          越南保禄小学三年班,学生需要由上至下、从左到右的顺序,填入1至9的数字,可重复填写,并按先乘除后加减的运算法则,完成整条算式。

         在越南教育科学研究所修读博士学位的阮玉江则利用计算机程序,找出所有可能组合,结果竟“印满74张A4纸”。她称计算机能轻易计出答案,“但人脑肯定不容易”。其中        一 个正确的数字组合是1、1、1、1、1、3、7、9、1。


     听说难倒了很多人,我也喜欢小学生的题,感兴趣花3小时写了一个。第一次写博客,献丑了,再此虚心求教。

    大概思路是这样:计算公式:x1+(13*x2/x3)+x4+(12*x5)-x6-11+(x7*x8/x9)-10
         * 思路:
         * 1、需要填的九个空分别编号x1-x9,填法随意,隐含约束x9、x3不能为0(除数);
         * 2、将上式中三个括号提取出来分别计算,将结果存入3个HashMap(value:计算结果,key:value对应的所填数值的字符串,这样可以保证key值唯一)
         * 3、最后以三个map代替三个括号计算上式,直接打印值为66时x1-x9的值
         */

     下边上代码,新人勿喷

package com.li;

import java.util.HashMap;
import java.util.Map;


public class Eight8 {
    
    public static void main(String []args){

        //x1+(13*x2/x3)+x4+(12*x5)-x6-11+(x7*x8/x9)-10
        Map<String,Double> map1 = new HashMap<String,Double>();
        Map<String,Double> map2 = new HashMap<String,Double>();
        Map<String,Double> map3 = new HashMap<String,Double>();
        
        //第一个括号
        for(double x2=0;x2<=9;x2++){
            for(double x3=1;x3<=9;x3++){
                map1.put(",  x2="+x2+",  x3="+x3, 13*x2/x3);
            }
        }
        //第二个括号
        for(double x5=0;x5<=9;x5++){
            map2.put(",  x5="+x5, 12*x5);
        }
        //第三个括号
        for(double x7=0;x7<=9;x7++){
            for(double x8=0;x8<=9;x8++){
                for(double x9=1;x9<=9;x9++){
                    map3.put(",  x7="+x7+",  x8="+x8+",  x9="+x9, x7*x8/x9);
                }
            }
        }
        
        int temp = 1;
        //x1+(13*x2/x3)+x4+(12*x5)-x6-11+(x7*x8/x9)-10
        /**
         * 计算公式:x1+(13*x2/x3)+x4+(12*x5)-x6-11+(x7*x8/x9)-10
         * 思路:
         * 1、需要填的九个空分别编号x1-x9,填法随意,隐含约束x9、x3不能为0(除数);
         * 2、将上式中三个括号提取出来分别计算,将结果存入3个HashMap(value:计算结果,key:value对应的所填数值的字符串,这样可以保证key值唯一)
         * 3、最后以三个map代替三个括号计算上式,直接打印值为66时x1-x9的值
         */
        for(double x1=0;x1<=9;x1++){//核心
            for(String key1:map1.keySet()){
                for(double x4=0;x4<=9;x4++){
                    for(String key2:map2.keySet()){
                        for(double x6=0;x6<=9;x6++){
                            for(String key3:map3.keySet()){
                                
                                double num = x1+map1.get(key1)+x4+map2.get(key2)-x6-11+map3.get(key3)-10;
                                
                                if(num==66){//&&x1==1&&x4==1&&x6==3
                                    System.out.println(temp+":  x1="+x1+key1+",  x4="+x4+key2+",  x6="+x6+key3);
                                    temp++;
                                }
                                
                            }
                            
                        }
                    }
                    
                }
                
            }
        }
    }
}


1 0
原创粉丝点击