從1到n 列印數字 (使用字串表示一個大數)
阿新 • • 發佈:2018-12-09
使用字串表示一個大數
題目:列印從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;
}