递归思想实现大数问题(打印1到n位最大整数)
2016-05-24 15:27
507 查看
假设给一个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 = '\0'; int i = 0; for (i = 0; i < 10; i++)/*把整个问题划分为一个个小问题*/ { num[0] = i + '0';/*把最高位分为0-9的小部分*/ inc(num, n, 0); } system("pause"); return 0; }