输出杨辉三角的前一百万行,假设屏幕足够宽。
一直以为,杨辉三角只是一个很小儿科的问题……直到那一天,我遇见了它……
第一次初识它时,只觉得天空很蓝,云淡风清。后来叫了GCC和VC过来和它认识了一下以后,狂风大作,昏天黑地。
在我所了解到的知识中,杨辉三角的输出算法比较简单的有两种,一种是需要申请数组的,用前一行的值计算出下一行的值;另一种是不需要申请数组的,直接根据行号来得出每一个数。输出10行的简单demo分别如下:
这是第一种,需要申请一个行号那么大的数组。
这种不需要申请数组,每次根据行号来计算每一个数,只需要存储个中间变量就行了。
本来以为,我只要抛出上面两种方法中随便一种,就可以秒杀此题的,后来才发现,一切都不是那么简单的……
分析:
一、栈空间的限制。分配一个int[1000000]在栈中是不行的,经过我的测试,在GCC下,如果main函数里面除了这个数组和一个循环变量外什么其它变量都不申请,最多可以申请int[520635],否则将产生段错误;而在VC下,这个数字更是将减少到258651。这应该就是默认分配的一个函数的栈空间大小,估算一下GCC编译器下应该是2MB,而VC下应该是1MB。所以分配一个1000000的int至少需要扩容栈空间后才能做,或者,将其分配到堆空间或静态区。
二、数据溢出。在杨辉三角计算到第31行时,int型数据就已经溢出,这样一样,就算我申请为__int64等类型,那也肯定是过不了百行的,数据用什么样的数据类型或结构存储很成问题。大数存储?比如使用vector向量容器来解决。
显然面对这个数量级,申请一个数组来储存它是不明智的。。。那么比较好一点的处理方案会是从不需要申请数组的方案中生出来。以前也写过一点大数存储的东西,是用vector限制每个元素的位数然后进位,但又是乘又是除的,我没什么太好的思路……
这是以前在笔试中遇到的一个问题,后来仔细想了想,还是没能把它干掉,问题老挂着会让人抑郁的,期待坛中的牛人们来点思路来点demo。。。
输出杨辉三角的前一百万行,假设屏幕足够宽。第一次初识它时,只觉得天空很蓝,云淡风清。后来叫了GCC和VC过来和它认识了一下以后,狂风大作,昏天黑地。
在我所了解到的知识中,杨辉三角的输出算法比较简单的有两种,一种是需要申请数组的,用前一行的值计算出下一行的值;另一种是不需要申请数组的,直接根据行号来得出每一个数。输出10行的简单demo分别如下:
//需要申请数组的
int a[10] = {0};
a[0] = 1;
a[1] = 1;
cout << “1″ << endl;
cout << “1 1″ << endl;
for(int i = 2; i < 10; i++)
{
for(int j = i; j > 0; j–)
{
a[j] = a[j] + a[j-1];
cout << a[j] << ” “;
}
cout << “1″ << endl;
}
这是第一种,需要申请一个行号那么大的数组。
//不需要申请数组的
for(int i = 1; i <= 10; i++)
{
int n = 1;
cout << n << ” “;
for(int j = 1; j < i; j++)
{
n = n*(i-j)/j;
cout << n << ” “;
}
cout << endl;
}
这种不需要申请数组,每次根据行号来计算每一个数,只需要存储个中间变量就行了。
本来以为,我只要抛出上面两种方法中随便一种,就可以秒杀此题的,后来才发现,一切都不是那么简单的……
分析:
一、栈空间的限制。分配一个int[1000000]在栈中是不行的,经过我的测试,在GCC下,如果main函数里面除了这个数组和一个循环变量外什么其它变量都不申请,最多可以申请int[520635],否则将产生段错误;而在VC下,这个数字更是将减少到258651。这应该就是默认分配的一个函数的栈空间大小,估算一下GCC编译器下应该是2MB,而VC下应该是1MB。所以分配一个1000000的int至少需要扩容栈空间后才能做,或者,将其分配到堆空间或静态区。
二、数据溢出。在杨辉三角计算到第31行时,int型数据就已经溢出,这样一样,就算我申请为__int64等类型,那也肯定是过不了百行的,数据用什么样的数据类型或结构存储很成问题。大数存储?比如使用vector向量容器来解决。
显然面对这个数量级,申请一个数组来储存它是不明智的。。。那么比较好一点的处理方案会是从不需要申请数组的方案中生出来。以前也写过一点大数存储的东西,是用vector限制每个元素的位数然后进位,但又是乘又是除的,我没什么太好的思路……
这是以前在笔试中遇到的一个问题,后来仔细想了想,还是没能把它干掉,问题老挂着会让人抑郁的,期待坛中的牛人们来点思路来点demo。。。
...全文
相关推荐
输出杨辉三角的前10行
输出杨辉三角的前10行的源代码。
C++二维数组实现杨辉三角的前10行输出
### C++实现杨辉三角的前10行输出#### 背景介绍杨辉三角(也称为帕斯卡三角)是一种常见的数学结构,在组合数学、概率论以及多项式展开等方面有着广泛的应用。
打印杨辉三角前n行算法
在计算机科学中,杨辉三角的应用也非常广泛,例如在动态规划、图论和编码问题中都有所体现。在C语言中实现打印杨辉三角的前n行,通常涉及数组或链表的数据结构。
“打印杨辉三角前n行”C语言源代码
本程序可以打印出杨辉三角的前n行,多少行在宏定义中输入
C语言在屏幕上输出杨辉三角
C语言在屏幕上输出杨辉三角是一种常见的编程练习,用于理解递归和数组操作的基本概念。杨辉三角,又称贾宪三角,源自中国古代数学家杨辉的工作,它与数学中的二项式定理和组合数学有着密切关系。在杨辉三角中,每个


