# 打印1到最大的n位数

```#include <string.h>

#include <iostream>
using namespace std;

//利用case语句使字符++
char CharPlus(char a)
{
char b;
switch ( a )
{
case '0': b = '1';  break;
case '1': b = '2';  break;
case '2': b = '3';  break;
case '3': b = '4';  break;
case '4': b = '5';  break;
case '5': b = '6';  break;
case '6': b = '7';  break;
case '7': b = '8';  break;
case '8': b = '9';  break;
case '9': b = '0';  break;
default:  cout<<"error"<<endl;
}
return b;
}

bool Increment(char* numchar,int len)
{
bool flag = false;
if ( numchar[0] == '9' )                        //用于判断越界情况处理
flag=true;
for (len = len-1; len >= 0; len-- )             //从数字低位开始更新
{
numchar[len] = CharPlus( numchar[len] );    //更新该位上的数字
if ( numchar[len] != '0' )                  //判断是否向高位进位,如果该为由9->0，则向高位进位
break;
if ( flag && numchar[0]=='0' )              //数值最高位从'9'变为'0'时，数值溢出,结束递增
return false;
}
return true;
}

//打印输出时，要符合一般习惯，把前面的0去掉,从左开始打印
void PrintNum(char* numchar){
int i = 0;
bool flag = false;
while(numchar[i++] == '0');//找到数值从高位到低位第一个不为'0'的位置
--i;
while ( numchar[i] != '\0' ){
cout<<numchar[i];
i++;
}
cout<<endl;
}

void Print1ToMaxOfNDigits(int n){
if ( n <= 0 ){
cout<<n<<" is illegal"<<endl;
return;
}
char * numchar = new char[n+1];
memset( numchar,'0',sizeof(char)*(n+1) );
numchar[n] = '\0';                  //先对字符串数组初始化

while ( Increment(numchar,n) )      //字符串数组++，如果已经是最大则返回false
{
PrintNum(numchar);              //打印出该数字
}
delete[] numchar;
}

int main(){
Print1ToMaxOfNDigits(1);
}```

```void Print1ToMaxOfNDigitsRecursively(char* numchar, int length, int index)
{
if ( index == length -1)
{
PrintNum(numchar);
return;
}
for ( int i = 0; i < 10; i++ )
{
numchar[index+1] = i +'0';
Print1ToMaxOfNDigitsRecursively(numchar, length, index+1);
}

}
void Print1ToMaxOfNDigits(int n)
{
if ( n <= 0 )
{
cout<<n<<" is illegal"<<endl;
return;
}
char * numchar = new char[n+1];
numchar[n] = '\0';                  //先对字符串数组初始化

for ( int i = 0; i < 10; i++ )
{
numchar[0] = i + '0';
Print1ToMaxOfNDigitsRecursively(numchar,n,0);
}

delete[] numchar;
}  ```

# 参考文献

[1]http://blog.csdn.net/zhaojinjia/article/details/8776639. [2]剑指offer.何海涛.电子工业出版社

472 篇文章39 人订阅

0 条评论

## 相关文章

8020

### 程序员进阶之算法练习（三十三）LeetCode专场

BAT常见的算法面试题解析： 程序员算法基础——动态规划 程序员算法基础——贪心算法 工作闲暇也会有在线分享，算法基础教程----腾讯课堂地址。 今天继...

9910

### HUST 1586 数字排列

1586 - 数字排列 时间限制：1秒 内存限制：128兆 91 次提交 36 次通过 题目描述现有n个k位的数字，你的任务是重新安排数字每一位的位置，使得...

304120

25850

### Java基础-06.总结二维数组，面向对象

1:二维数组(理解) (1)元素是一维数组的数组。 (2)格式： A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][]...

30340

13310

6810

12720

17130

11720