从1到n 打印数字 (使用字符串表示一个大数)

使用字符串表示一个大数

题目:打印从1到n 的数
n是多大我们并不知道,有可能已经超出了计算机所能表示的最大的数,所以此时需要使用字符串或数组来表示一个任意大小的数,并对其进行打印,对于打印下面有两种方法

使用加法模拟

void PrintNum(int N)
{
    if (N <= 0)
        return;
    char *str=malloc(sizeof(char)*(N+1));
    int cur = N;
    int end;
    int tmp;
    int i = 0;
    str[cur--] = '\0';
    end = cur;
    for (i = 0; i < N; i++)   //先将所有数置零
        str[i] = '0';
    for (i = 0; i <pow(10, N) - 1; i++)
    {
        cur = end;
        str[cur] += 1;    //每次从最末位开始加一
        while (str[cur]>'9')//当该位大于9时进位
        {
            cur--;
            str[cur] += 1;
            tmp = cur;
            while (tmp != N - 1)  //将进位后数清零
            {
                str[++tmp] = '0';
            }
        }
        print(str,N);
    }
    free(str);
    str = NULL;
}

从一到n的数相当于是0到9的n位数的全排列,将所有的全排列打印就相当于是模拟n位的十进制数

使用全排列进行求解,通过递归的调用类似于回溯的方法从前往后,由0到9改变值

void PrintNumR(char* str,int len,int n)
{
    int i = 0;
    if (n==len)  //到达字符串最后一位时打印
    {
        printf("%s\n", str);
        return;
    }
    for (i = 0; i < 10; i++)    //从前往后通过递归由0到9进行全排列
    {
        str[n+1] = i + '0';
        PrintNumR(str,len,n + 1);
    }
}
int main()
{
    int n = 3;
    int i = 0;
    char *str = malloc(sizeof(char)*(n + 1));
    memset(str, '0', n);
    str[n] = '\0';
    int len = n-1;
    for (i = 0; i < 10; i++)
    {
        str[0] = i + '0';   //第一位数的全排列
        PrintNumR(str, len, 0);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/M_jianjianjiao/article/details/82633510