《剑指offer》——打印1到最大的n位数

考虑大数问题,使用字符数组存储,

#include<iostream>
using namespace std;

bool inc(char *num)
{
    //累加结束标志,初始为false
    //只有当下标为0的位置上产生进位时,才能表明打印结束
    bool flag = false;
    int len = strlen(num);
    int c = 0;//进位标志
    for(int i = len - 1; i >= 0; i--)
    {
        num[i] = num[i] + c;
        if(i == len - 1)//每次自加都在第len-1位上进行
            ++num[i];
        if(num[i] > '9')//如果大于9,则进位
        {
            if(i == 0)//如果在第0位置上产生进位,设置flag为true
                flag = true;
            else//否则将当前位置上的值减10,并将进位标志置1
            {
                num[i] -= 10;
                c = 1;
            }
        }
        else
        {
            break;//如果不大于10,则结束循环,直接打印
        }
    }
    return flag;
}

void show(char *num)
{
    while(*num == '0')//跳过之前为0的字符,如跳过098前面的0
        num++;
    while(*num != '\0')//输出当前的字符
    {
        cout << *num;
        num++;
    }
}

void print(int n)
{
    if(n <= 0)//错误的输入
        cout << "error" << endl;
    char *num = new char[n + 1];//新建一个长度为n+1的字符数组
    memset(num, '0', n);//将数组初始化
    num[n] = '\0';//设置结束位
    while(!inc(num))
        show(num);//循环打印每个数
}

int main() {
    print(3);//输出1~999
    return 0;
}

你可能感兴趣的:(《剑指offer》——打印1到最大的n位数)