您的位置:首页 > 编程语言 > C语言/C++

打印1到最大的n位数

2017-11-10 09:27 260 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的三位数999。

这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候,在字符串的前半部分补0。

首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符表示的数字加1。

那么什么时候停止给字符串表示的数字加1呢?我们注意到,当字符串为“999…9”时,给字符串加1,就会在第一位上产生进位,此时表示已经到了最大的n位数,循环终止。

bool InCreament(char* number)
{
bool isoverflow = false;//当第一位有进位的时候,循环终止
int nTakeOver = 0;//进位
int nlength = strlen(number);
for (int i = nlength - 1; i >= 0; --i)
{
int nsum = number[i] - '0' + nTakeOver;
if (i == nlength - 1)
nsum++;

if (nsum >= 10)//需要进位
{
if (i == 0)//当第一位进位时,循环终止
{
isoverflow = true;
}
else
{
nsum -= 10;
nTakeOver = 1;
number[i] = '0' + nsum;
}
}
else
{
number[i] = '0' + nsum;
break;
}
}
return isoverflow;
}


第二步,打印数字。这里需要注意的是,比如数字为099,我们需要打印的是99,忽略前面的0。所以,在打印的时候,我们需要从第一个不为0的位开始打印。

void PrintNumber(char* number)
{
bool isBegining0 = true;
int nlength = strlen(number);
for (int i = 0; i < nlength; ++i)
{
if (isBegining0 && number[i] != '0')
{
isBegining0 = false;
}
if (!isBegining0)
{
//打印第一个非0位的数字
printf("%c", number[i]);
}
}
printf("\t");
}


void Print1ToMaxOfDigits(int n)
{
if (n <= 0)
return;
char* number = new char[n + 1];
memset(number, '0', n);
number
= '\0';
while (!InCreament(number))
{
PrintNumber(number);
}
delete[] number;
}


当n为2的时候,应该打印出1到99的每个数字。

int main()
{
Print1ToMaxOfDigits(2);
system("pause");
return 0;
}




我们可以想到,其实n未的所有十进制就是在每个位上对0-9进行一次全排列,数字的每一位都有可能是0-9中的一个数。

void PrintNumber(char* number)
{
bool isBegining0 = true;
int nlength = strlen(number);
for (int i = 0; i < nlength; ++i)
{
if (isBegining0 && number[i] != '0')
{
isBegining0 = false;
}
if (!isBegining0)
{
//打印第一个非0位的数字
printf("%c", number[i]);
}
}
printf("\t");
}
void PrintDigtit(char* number, int length, int index)
{
if (index == length - 1)
{
PrintNumber(number);
return;
}
for (int i = 0; i < 10; ++i)
{
number[index + 1] = i + '0';
PrintDigtit(number, length, index + 1);
}
}

void PrintMax(int n)
{
if (n <= 0)
return;
char* number = new char[n + 1];
number
= '\0';
for (int i = 0; i < 10; i++)
{
number[0] = i + '0';
PrintDigtit(number, n, 0);
}
delete[] number;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++