内容:记录一下刷题的过程
首先先附上源码
#include <iostream>
using namespace std;
void PrintNum(char * num)
{
bool isBeginning = true;
int len = strlen(num);
for (int i = 0; i < len; ++i)
{
if (isBeginning&&num[i] != '0')
isBeginning = false;
if (!isBeginning)
printf("%c", num[i]);
}
printf("\t");
}
void Print1ToMaxOfNDigitsRecursively(char *num, int length, int index)
{
if (index == length - 1)
{
PrintNum(num);
return;
}
for (int i = 0; i < 10; ++i)
{
num[index + 1] = i + '0';
Print1ToMaxOfNDigitsRecursively(num, length, index + 1);
}
}
void Print1ToMaxN(int n)
{
if (n <= 0)
{
return;
}
char *num = new char[n + 1];
num[n] = '\0';
for (int i = 0; i < 10; ++i)
{
num[0] = i + '0';
Print1ToMaxOfNDigitsRecursively(num, n, 0);
}
delete []num;
}
int main()
{
Print1ToMaxN(2);
system("pause");
return 0;
}
这里是结果:
原理:n位所有十进制数其实就是n个从0-9的全排列。也就是说,我们把数字的每一位从0-9排列打印一遍,就得到了所有的二进制数。另外,为了我们的阅读习惯,注意最开始的0不要打印。比如:001,打印1就好。
全排列用递归的方式很容易表达,数字的每一位都可能是0-9中的一个数,然后设置下一位。递归结束的条件使我们已经设置了数字的最后一位。
PS:这些都是个人观点,如果哪里有错误的,欢迎评论区批评指正^ - ^