使用字符串表示一个大数
题目:打印从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;
}