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

输入数字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.大数的加减法乘法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值