您的位置:首页 > 其它

输出0到最大的n位数

2012-08-28 11:11 120 查看
1. 描述

输入数字 n,按顺序输出从 0 最大的 n 位 10 进制数。比如输入 3,则输出 0、1、2、3 一直到最大的 3位数,即 999。

2. 思路

方法一,求出最大的n位数(10^3 - 1),然后由一个循环控制输出。

方法二,当n很大时,方法一不再适用,此时可用字符串模拟数字运算,代码较长。

方法三,由<字符串的排列和组合>的递归算法得到启示,可以利用递归求解。

下面就用方法三求解了!

如果在数字前面补 0 的话,则 n 位所有 10 进制数就是 从 0 到 9 (n个数,从0到9任取3个,可重复取)的全排列。即,把数字的每一位都从 0 到 9 排列一遍,就得到了所有的 10 进制数。此时们在输出的时候,去掉前导的零即可。

代码如下:

void print1ToMaxOfNDigits(int n)
{
if (n <= 0) return ;
char number[n + 1];
number
= '\0';		//number[0...n-1]存放n位数,number
为结束标志'\0'
int i;
for (i = 0; i < 10; i++)	//n位数的最高位: 0, 1, ..., 9
{
number[0] = i + '0';
print1ToMaxOfNDigitsRecursively(number, n, 0);
}
}


其中递归算法print1ToMaxOfNDigitsRecursively如下:

void print1ToMaxOfNDigitsRecursively(char number[], int n, int index)
{
if (n == index + 1)
{
printNumber(number);
return ;
}
int i;
for (i = 0; i < 10; i++)
{
number[index + 1] = i + '0';// 对0, 1, ..., 9   n位数的每一位都会选择一遍
print1ToMaxOfNDigitsRecursively(number, n, index + 1);
}
}


打印函数printNumber如下:

void printNumber(char number[])
{
char *p;
for (p = number; *p; p++)	//从最高位开始,找到第一个非零数字
if (*p != '0')
break;
if (*p)
printf("%s\n", p);
else
printf("0\n");
}


测试如下:

#include <stdio.h>

void print1ToMaxOfNDigits(int n);
void print1ToMaxOfNDigitsRecursively(char number[], int n, int index);
void printNumber(char number[]);
int main(void)
{
print1ToMaxOfNDigits(1);
return 0;
}


Output:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: