这两天在刷蓝桥杯题库的时候遇到这样一道题
某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答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自带的一些方法对于我们解决一些问题有很大的帮助
网友评论