问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
本题有两种解题方法。
思路一: 十进制转化为二进制
#include<stdio.h>
#include<math.h>
#define N 5
void Print(int s[])
{
for(int i = N-1;i >= 0;i--)
printf("%d",s[i]);
printf("\n");
}
void BtoD(int n) //十进制转化为二进制
{
int i = 0;
int s[N] = {0};
while(n) {
s[i++] = n % 2;
n /= 2;
}
Print(s);
}
int main()
{
for(int i = 0;i < pow(2,N);i++) {
BtoD(i);
}
}
思路二: 数字信号二分频
#include<stdio.h>
#include<math.h>
#define N 5
void Print(int s[])
{
for(int i = N-1;i >= 0;i--) {
printf("%d",s[i]);
}
printf("\n");
}
int beat(int *p) //数字信号的翻转
{
*p ? *p = 0 : *p = 1; //翻转
if(*p) return 0; //上升沿
else return 1; //下降沿
}
void signal(int *s)
{
int record[N] = {0};
record[0] = beat(&s[0]); //s[0]是时钟信号,每次调用signal都翻转
int i = 1;
while(record[i-1] && i < N) { //下降沿翻转
record[i] = beat(&s[i]);
i++;
}
}
int main()
{
int s[N] = {0};
Print(s);
for(int i = 1;i < pow(2,N);i++) {
signal(s);
Print(s);
}
}
s[0] 是基础的时钟信号,当有下降沿出现的时候进位。