1. 程式人生 > >從1到n 列印數字 (使用字串表示一個大數)

從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; }