剑指offer-12:打印1到最大的n位数

来源:互联网 发布:淘宝客招代理话术 编辑:程序博客网 时间:2024/06/07 07:16

输入数字n,按顺序打印从1到最大的n位十进制数。
例如:n=3,则打印1,2,3都999。

分析:

  • 此题并未给出n的范围,若取n=10,则int表示溢出。所以考虑大数问题。
  • 用字符串或者数组可以表示大数。
  • 本质是全排列问题,即n位每个位从0-9排列,可用递归实现。
  • 打印数字时,需要考虑从第一个非0的元素开始打印。
// offer-12-print_n.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <string>using namespace std;// 打印数组,从第一个非0的开始打void PrintNumber(char * number, int length){    bool First0 = true;    for(int i = 0; i < length; ++i)    {        if(number[i] != '0' && First0)            First0 = false;        if(!First0)            cout << number[i];          }    // 全0时不打印换行    if(First0);    else        cout << endl;}// 递归打印全排列数void Print1toN_Recursive(char * number, int length, int index){    if(index == length - 1)    {        PrintNumber(number, length);        return;    }    for(int i = 0; i < 10; ++i)    {        number[index + 1] = i + '0';        Print1toN_Recursive(number, length, index+1);    }}// 第0位共10个排列,依次起头进递归void Print1toN(int n){    if(n <= 0)        return;    char * number = new char[n+1];    number[n] = '\0';    for(int i = 0; i < 10; i++)    {        number[0] = i + '0';        Print1toN_Recursive(number, n, 0);    }    delete [] number;}// 测试int _tmain(int argc, _TCHAR* argv[]){    int n;    while(1)    {        cin >> n;        Print1toN(n);    }    return 0;}

1.有没有更高效的表示大数?
一个char型字符表示可表示256个字符,而十进制数字只有0-9的10个数字,并没有充分利用。

2.大数的加减法,乘法。