美文网首页
java中生成一定位数的所有可能的二进制组合的结果

java中生成一定位数的所有可能的二进制组合的结果

作者: 流年花影 | 来源:发表于2017-09-08 22:35 被阅读0次

    这两天在刷蓝桥杯题库的时候遇到这样一道题
    某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。答案写在“解答.txt”中,不要写在这里!
    这道题其实本身没有什么难度,只需要生成十位二进制的所有组合,然后逐一去测试就好,关键就在于如何生成这些组合,在之前我并不知道java中有将整形变量转换为对应二进制的方法,所以使用笨方法,用十层循环生成所有结婚,代码如下

    public class Text {
    
        public static void main(String[] args) {
            int a=(int) Math.pow(2, 10);
            String[] s=new String[a];
            int x=0;
            for(int q=0;q<=1;q++){          //十层for循环生成所有可能的十位二进制组合的可能结果
                for(int w=0;w<=1;w++){
                    for(int e=0;e<=1;e++){
                        for(int r=0;r<=1;r++){
                            for(int t=0;t<=1;t++){
                                for(int y=0;y<=1;y++){
                                    for(int u=0;u<=1;u++){
                                        for(int i=0;i<=1;i++){
                                            for(int o=0;o<=1;o++){
                                                for(int p=0;p<=1;p++){
                                                    s[x]=q+""+w+""+e+""+r+""+t+""+y+""+u+""+i+""+o+""+p;
                                                    x++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            char[] c=new char[10];
            for(int n=0;n<x;n++){    //对每一个可能的结果进行分析,如果符合题目要求就输出
                int m=10;
                c=s[n].toCharArray();
                for(int z=0;z<=9;z++){
                    if(c[z]=='0'){
                        m=m-z-1;
                    }else{
                        m=m*2;
                    }
                }
                if(m==100){
                    System.out.println(s[n]);
                }
            }
        }
    }
    

    结果:
    1011010000
    0111010000
    0010110011
    可以看出结果正确,但过程过于复杂,如果是更多位的组合,这种方法显然不行,后来通过查资料发现java中有将int变量转换为对应二进制的方法,就尝试了一下,代码如下

    public class Text4 {
    
        public static void main(String[] args) {
            int a=(int) Math.pow(2, 10);
            String[] s=new String[a];
            int x=0;
            for(int i=a;i>0;i--){
                String bin=Integer.toBinaryString(i);  //此方法返回值参数表示的无符号整数的二进制的字符串表示形式(基数为2)
                while(bin.length()<10){                //Integer.toBinaryString只返回参数的二进制表示形式,我们需要的是十位二进制,所以要在结果前面补零
                    bin="0"+bin;
                }
                s[x]=bin;
                x++;
            }
            char[] c=new char[10];
            for(int n=0;n<x;n++){    //对每一个可能的结果进行分析,如果符合题目要求就输出
                int m=10;
                c=s[n].toCharArray();
                for(int z=0;z<=9;z++){
                    if(c[z]=='0'){
                        m=m-z-1;
                    }else{
                        m=m*2;
                    }
                }
                if(m==100){
                    System.out.println(s[n]);
                }
            }
        }
    }
    结果:
    1011010000 
    0111010000
    0010110011
    可以看出熟悉java自带的一些方法对于我们解决一些问题有很大的帮助
    

    相关文章

      网友评论

          本文标题:java中生成一定位数的所有可能的二进制组合的结果

          本文链接:https://www.haomeiwen.com/subject/orgnjxtx.html