输出杨辉三角的前一百万行,假设屏幕足够宽。

mzlogin mzlogin 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
一直以为,杨辉三角只是一个很小儿科的问题……直到那一天,我遇见了它……
    输出杨辉三角的前一百万行,假设屏幕足够宽。




第一次初识它时,只觉得天空很蓝,云淡风清。后来叫了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。。。
...全文
评论 21
收藏 已收藏
分享
返回顶部
mzlogin
C++ 语言 65,214 成员 250,514 内容