64,648
社区成员
发帖
与我相关
我的任务
分享
输出杨辉三角的前一百万行,假设屏幕足够宽。
//需要申请数组的
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;
}
简单的试了下, 在我的破本上, 如果要输出结果, 那还是洗洗睡吧.....
如果不输出结果, 试了下 10K 用时大概是 23秒, 20K 用时大概是 3分钟, 基本上还是洗洗睡吧.....
gmp 性能不算非常好, 特别是10进制格式化输出的时候, 八过基本上要比 gmp 快一点点都是要死很多脑细胞的, 看起来这个不是个好问题.....
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
#ifndef XNUM
#define XNUM 1024
#endif
int main()
{
int i , j ;
mpz_t *arr = (mpz_t*)malloc( XNUM * sizeof( mpz_t ) );
for( i = 0; i < XNUM; ++i )
mpz_init( arr[i] );
mpz_set_ui( arr[0] , 1 );
mpz_set_ui( arr[1] , 1 );
printf( "1\n1 1\n" );
for( i = 2; i < XNUM; ++i )
{
if( 0 == i%(XNUM/100) )
{
fputc( '.' , stderr );
fflush(stderr);
}
for( j = i; j > 0 ; --j )
{
mpz_add( arr[j] , arr[j] , arr[j-1] );
gmp_printf( "%Zd " , arr[j] );
}
printf( "1\n" );
}
fputc( '\n' , stderr );
for( i = 0; i < XNUM; ++i )
mpz_clear( arr[i] );
return 0;
}
1K 情况下生存的数据文件是 74M
$ gcc -DXNUM=1024 -O3 -Os c1.c -lgmp && time ./a > result
.....................................................................................................
real 0m5.860s
user 0m3.405s
sys 0m1.265s
2K 情况下生存的数据文件是 592M
$ gcc -DXNUM=2048 -O3 -Os c1.c -lgmp && time ./a > result
......................................................................................................
real 0m47.219s
user 0m31.124s
sys 0m8.562s
4K 情况下生存的数据文件是 4.62G
$ gcc -DXNUM=4096 -O3 -Os c1.c -lgmp && time ./a > result
......................................................................................................
real 6m40.796s
user 4m30.796s
sys 1m11.421s
更大的 8K+ , 16K+ 啥的时候还是洗洗睡吧.....