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

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//

/*
Q:
    输入一个数字,按顺序打印出从1到n位的十进制数。
        例如:
            输入: 3
            输出: 1,2,3,......,999
S:
    1.题目没有明确输入的n表示的n位十进制最大的数,是否会是大数,
      这里必须考虑大数问题,然后采用字符串的方法表示。
    
*/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

void printNumber(char*number)
{
    bool isBegining = true;
    int lengh = strlen(number);
    for(int i = 0; i < lengh; ++i)
    {
        if(isBegining && number[i] != '0')
            isBegining = false;
        
        if(!isBegining)
        {
            std::cout << number[i];
        }

        if(isBegining && (i== lengh - 1))
            std::cout << number[i];
    }
    std::cout << std::endl;
}

bool increment(char*number)
{
    int nTakeOver = 0;
    bool overflow = false;
    int length = strlen(number);
    for(int i = length - 1; i >=0; --i)
    {
        int sum = number[i] - '0' + nTakeOver;
        
        if(i == length - 1)
            ++sum;

        if(sum >= 10)
        {
            if(i == 0)
            {
                overflow = true;
            }else{
                sum -= 10;
                nTakeOver = 1;
                number[i] = sum + '0';
            }
        }else{
            number[i] = sum + '0';
            break;
        }
    }
    return overflow;
}

void printToMaxDigits(int n)
{
    if(n <= 0)
        return;
    char*number = new char[n + 1];
    memset(number, '0', n);
    number[n] = '\0';

    while(!increment(number))
    {
        printNumber(number);
    }
    delete []number;
}

void test_printNumber()
{
    std::cout << "test_printNumber func" << std::endl;
    char*str_1 = "123456";
    printNumber(str_1);

    str_1 = "1234560000";
    printNumber(str_1);

    str_1 = "001234";
    printNumber(str_1);

    str_1 = "00001235000";
    printNumber(str_1);

    str_1 = "00000000000000001";
    printNumber(str_1);

    str_1 = "000000000000000010";
    printNumber(str_1);

    str_1 = "000000";
    printNumber(str_1);
}

void test_printToMaxDigits()
{
    std::cout << "test_printToMaxDigits func" << std::endl;
    printToMaxDigits(-2);
    printToMaxDigits(-1);
    printToMaxDigits(0);
    printToMaxDigits(1);
    printToMaxDigits(2);
    printToMaxDigits(3);
    printToMaxDigits(3);
    printToMaxDigits(4);
}

int main(int argc, char**argv)
{

    test_printNumber();

    test_printToMaxDigits();

    return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值