经过了一天的虐心历程,我终于下定决心开始写博客记录我的做题过程,今天做的是蓝桥杯试题集里的第二题《 01 字符串》问题,很基础的一道题,我却死在了一个小小的错误上。
原题题意为:
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
题目提供了 32 种这个数据量,于是想到了前段时间学习的递归,但是很显然本题用循环就能做出来,我没有像其他人那样用五个 for 循环暴力出来,而是使用了数组来存放,先写一个 while( ) 循环循环 32 次,后来写一个 while( ) 循环来实现进位操作,如果当前位数数值到 2 就清零同时进位,最后输出。
附代码:
#include<stdio.h>
int main()
{
int a[5] = {0},i = 32,n,m,z;
while(i)
{
for(m = 0; m < 5; m++)
printf("%d",a[m]);
printf("\n");
n = 4;
a[n]++;
while(n+1)
{
if(a[n] == 2)
{
a[n] = 0;
a[n - 1]++;
}
n--;
}
i--;
}
return 0;
}
做题时,先是在 C-Free 上运行后每次都无限输出 00000 搞不懂为什么,后来调试功能又死活启动不了,终于在晚上时放弃了
对 C-Free 的拯救,使用了 Dev c++ 后顺畅完成了任务,原来一直只是在 if 语句判断的时候只写了一个等号,尴尬。写这篇博
客也是希望以后不要再犯这种低级错误。。。
最后附上暴力循环解法:
#include<iostream>
using namespace std;
int main(){
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
for(int m=0;m<2;m++){
for(int n=0;n<2;n++){
cout<<i<<j<<k<<m<<n<<endl;
}
}
}
}
}
return 0;
}
over~