递归思想实现大数问题(打印1到n位最大整数)

假设给一个20位的一个整数,大家都知道 int,float ,double 型都表示不了这么大的数,这就涉及到了大数的问题,我们可以用字符串来模拟这个20位的数。动态开辟一个21个char型大小的内存

char *num=(char *)malloc(21*sizeof(char));

我们将前20个内存初始化为‘0’,我们用这20位来模拟这个20位的整数。最后一位放一个‘\0’。

有时候递归可以简化问题,可以把大的问题划分为一个个的小部分逐一解决。在这里就用递归来解决(一开始会有点想不明白,但是一旦懂了就会感觉真的递归会比较容易。。。)

下面就是具体的实现

#include <stdio.h>

void print(const char *num)
{
    int i = 0;
    while (num[i] == '0')/*此处我们过滤了高位的0,让输出更符合我们习惯*/
    {
        i++;
    }
    printf("%s\n", num + i);
}

void inc(char *num, int len, int i)
{
    int j = 0;
    if (i == len - 1)/*递归到了最低位,开始输出*/
    {
        print(num);
        return;
    }
    for (j = 0; j < 10; j++)/*次高位再次划分为0-9*/
    {
        num[i+1] = j + '0';
        inc(num, len, i + 1);/*一直递归下去直到最低位*/
    }
}


int main()
{
    int n = 0;
    scanf("%d", &n);
    char *num = (char *)malloc(n + 1);
    num[n] = '\0';
    int i = 0;
    for (i = 0; i < 10; i++)/*把整个问题划分为一个个小问题*/
    {
        num[0] = i + '0';/*把最高位分为0-9的小部分*/
        inc(num, n, 0);
    }
    system("pause");
    return 0;
}


你可能感兴趣的:(C语言)