输出0到最大的n位数


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[n] = '\0';		//number[0...n-1]存放n位数,number[n]为结束标志'\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:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值