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

题目:输入数字n,按顺序打印出从1到最大的n为十进制数。比如输入3,则打印出1,2,3一直到最大的三位数即999。

思路:这道题一看就是一个大数问题。对于解决这个大数的问题,可以用到字符串或者数组都可以。

字符串解法:

对于一个字符串的话,
首先要考虑申请空间的时候,要申请n+1个因为最后还有一个’\0’
进行加法时从最后一位进行加法
判断是否溢出,可采用看是否到第一位了并要进位了

代码:

bool Increment(char** ps)
{
    char* str = NULL;
    assert(ps);

    str = *ps;
    bool isoverflow = false;
    int length = strlen(str);
    int takeover = 0;
    int num = 0;
    for (int i = length - 1; i >= 0; i--)
    {
        num = str[i] - '0' + takeover;

        //只加一次1
        if (i == length - 1)
        {
            num++;
        }

        //判断是否溢出或者是进位
        if (num >= 10)
        {
            //溢出
            if (i == 0)
            {
                isoverflow = true;
            }

            else
            {
                num -= 10;
                str[i] = '0' + num;
                takeover = 1;
            }
        }
        else
        {
            str[i] = '0' + num;
            break;
        }
    }

    return isoverflow;
}

void PrintStr(char* str)
{
    assert(str);

    bool isbeginning = false;
    int length = strlen(str);
    for (int i = 0; i < length; i++)
    {
        if (str[i] != '0' && !isbeginning)
        {
            isbeginning = true;
        }

        if (isbeginning)
        {
            printf("%c", str[i]);
        }
    }
    printf(" ");
}

void Print1ToMaxNdights(int n)
{
    if (n <= 0)
    {
        return;
    }

    char* str = (char*)malloc(sizeof(char) * (n + 1));
    if (str == NULL)
    {
        perror("use malloc!");
    }

    memset(str, '0', n);
    str[n] = '\0';

    while (!Increment(&str))
    {
        PrintStr(str);
    }

    free(str);
    str = NULL;
    printf("\n");
}

int main()
{
    int n = 0;
    scanf("%d", &n);
    Print1ToMaxNdights(n);
    return 0;
}

数组:对于数组和字符串差不多,只是将动态申请空间变成了整形的指针即可,后面就只需要整型了。

猜你喜欢

转载自blog.csdn.net/qq_40399012/article/details/82256118
今日推荐