一看到这个题目不知道怎么做,就是二进制的算法,但不知道怎么表达,在网上找到了以下解法
题目:
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
00001
00010
00011
<以下部分省略>
解法:
1.暴力破解
#include<stdio.h>
int main()
{
printf("00000\n");
printf("00001\n");
printf("00010\n");
printf("00011\n");
printf("00100\n");
printf("00101\n");
printf("00110\n");
printf("00111\n");
printf("01000\n");
printf("01001\n");
printf("01010\n");
printf("01011\n");
printf("01100\n");
printf("01101\n");
printf("01110\n");
printf("01111\n");
printf("10000\n");
printf("10001\n");
printf("10010\n");
printf("10011\n");
printf("10100\n");
printf("10101\n");
printf("10110\n");
printf("10111\n");
printf("11000\n");
printf("11001\n");
printf("11010\n");
printf("11011\n");
printf("11100\n");
printf("11101\n");
printf("11110\n");
printf("11111\n");
return 0;
}
可以做出来,但是适用情况少
2.
#include <iostream>
#include <string.h>
using namespace std;
int two[6];
int main() {
memset(two,0,sizeof(two));
cout<<"00000"<<endl;
for(int i=1;i<=31;i++){
two[5]++;
if(two[5]==2){
two[4]++;
two[5]=0;
}
if(two[4]==2){
two[3]++;
two[4]=0;
}
if(two[3]==2){
two[2]++;
two[3]=0;
}
if(two[2]==2){
two[1]++;
two[2]=0;
}
for(int m=1;m<=5;m++)
cout<<two[m];
cout<<endl;
}
return 0;
}
这个方法思路很清晰,就是应用了二进制加法,满二进一。是个好方法。希望自己也能灵活掌握吧。