這兩天在刷藍(lán)橋杯題庫(kù)的時(shí)候遇到這樣一道題
某電視臺(tái)舉辦了低碳生活大獎(jiǎng)賽。題目的計(jì)分規(guī)則相當(dāng)奇怪:每位選手需要回答10個(gè)問(wèn)題(其編號(hào)為1到10)岳枷,越后面越有難度惜浅。答對(duì)的狸棍,當(dāng)前分?jǐn)?shù)翻倍;答錯(cuò)了則扣掉與題號(hào)相同的分?jǐn)?shù)(選手必須回答問(wèn)題狞贱,不回答按錯(cuò)誤處理)。每位選手都有一個(gè)起步的分?jǐn)?shù)為10分蜀涨。某獲勝選手最終得分剛好是100分瞎嬉,如果不讓你看比賽過(guò)程,你能推斷出他(她)哪個(gè)題目答對(duì)了勉盅,哪個(gè)題目答錯(cuò)了嗎佑颇?如果把答對(duì)的記為1,答錯(cuò)的記為0草娜,則10個(gè)題目的回答情況可以用僅含有1和0的串來(lái)表示挑胸。例如:0010110011 就是可能的情況。你的任務(wù)是算出所有可能情況宰闰。每個(gè)答案占一行茬贵。答案寫在“解答.txt”中,不要寫在這里移袍!
這道題其實(shí)本身沒(méi)有什么難度解藻,只需要生成十位二進(jìn)制的所有組合,然后逐一去測(cè)試就好葡盗,關(guān)鍵就在于如何生成這些組合螟左,在之前我并不知道java中有將整形變量轉(zhuǎn)換為對(duì)應(yīng)二進(jìn)制的方法,所以使用笨方法,用十層循環(huán)生成所有結(jié)婚胶背,代碼如下
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循環(huán)生成所有可能的十位二進(jìn)制組合的可能結(jié)果
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++){ //對(duì)每一個(gè)可能的結(jié)果進(jì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]);
}
}
}
}
結(jié)果:
1011010000
0111010000
0010110011
可以看出結(jié)果正確,但過(guò)程過(guò)于復(fù)雜钳吟,如果是更多位的組合廷粒,這種方法顯然不行,后來(lái)通過(guò)查資料發(fā)現(xiàn)java中有將int變量轉(zhuǎn)換為對(duì)應(yīng)二進(jìn)制的方法红且,就嘗試了一下坝茎,代碼如下
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); //此方法返回值參數(shù)表示的無(wú)符號(hào)整數(shù)的二進(jìn)制的字符串表示形式(基數(shù)為2)
while(bin.length()<10){ //Integer.toBinaryString只返回參數(shù)的二進(jìn)制表示形式,我們需要的是十位二進(jìn)制暇番,所以要在結(jié)果前面補(bǔ)零
bin="0"+bin;
}
s[x]=bin;
x++;
}
char[] c=new char[10];
for(int n=0;n<x;n++){ //對(duì)每一個(gè)可能的結(jié)果進(jì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]);
}
}
}
}
結(jié)果:
1011010000
0111010000
0010110011
可以看出熟悉java自帶的一些方法對(duì)于我們解決一些問(wèn)題有很大的幫助