c语言超大数组
⑴ c语言中怎么处理一个特别大的数据的运算
最简单的办法是将大数当作字符串进行处理,也就是将大数用10进制字符数组进行表示,
然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,
因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有
数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志
及中间结果。其优点是算法符合人们的日常习惯,易于理解。
⑵ C语言中如何定义一个很大的全局数组
定义全局数组跟定义全局变量是一样的,下面举例来具体说明如何定义全局数组:
#include<stdio.h>
inta[100];//定义一个int类型的全局数组,数组中包含100个元素,每个元素类型都是int型
voidmain()
{
inti;
for(i=0;i<100;i++)
a[i]=i;//对全局数组进行初始化
}
⑶ c语言数组最大长度
理论上,c语言数组最大的大小没有限制,因为它用的是 虚拟存储。
对于写程序而言,例如要写下标,那么受 unsigned int 最大值的限制,只能用到十六进制 0xffffffff, 十进制4G多一点。
具体程序能获取多大,就很难说,有时编译可以通过,运行时出错。你也可以用 malloc 动态分配请求,看分配是否成功或失败。
对一般程序而言,数组长度通常够用了。
⑷ c语言问题。我想声明一个超大的二维数组——a[1000][1000],如何实现
直接定义 int a[1000][1000];变量存放在栈里,这个要看编译的时候栈的大小。
如果栈空间不够大,可以通过new实现。
int **a = new int *[1000];
for(int i=0;i<1000;i++){
a[i] = new int[1000];
}
⑸ c语言如何实现一个大数组
使用malloc分配啊,普通数组是定义在栈中的,大小受限制的。
⑹ c语言如何定义超过50万的大数组
由于栈大小的限制,这种规模的数组不能存在栈上,所以必须放在堆中。C语言中申请堆空间使用函数malloc:
#include<stdlib.h>
int*arr;
arr=malloc(sizeof(int)*500000);
if(arr==NULL)
空间申请失败;
注意要引用头文件stdlib.h
⑺ 请问C语言中大数组如何处理
你仔细看看这些数据都是有规律的,有相当大的一部分都是0 1 2 3 4 5 6 13重复了很多次。统计一下这些循环出现了多少次,如果考虑这个因素,压缩还是可以的。
否则的话,所有的数据都是0-15区间的整数,即使考虑使用4位二进制压缩,1个字节(8 bit)可以存2个整数,41502个数也需要20K byte,已经超过内存上限了...
如果数据没有规律,而且实在要压缩的话,考虑用霍夫曼编码可能好一些,不过我估计也挺悬的。可以考虑其他方式,不要保存在内存中,程序运行时需要哪一部分数据再读进来。
⑻ c语言里面数组过大如何处理
为什么定义这么大呢???
建议动态分配吧,不是一次性,而是根据需要分配。一个节点一个节点的申请内存。
文件操作的话,fread
可以指定文件指针位置,取出指定位置的数据。
⑼ C语言快速读取超大数组的问题
关键不在于你要把它读进去。
而在于:
1.文件哪来的,有办法不用那么大的文件么?建立文件的时候不能建立一个索引么?或者用一个便于访问的格式么?
2.文件要用来干什么?CPU一次只能处理几个字节,你为什么要把它全读到内存里呢?
如果第1条不能解决,也就是最坏的情况,那么建议:
做一个转换器,把原始文件转换成便于操作的文件再进行处理。所谓便于操作,就是说,每一行数据的大小固定,因而可以对数据进行快速访问。转一行存一行,不会花太多内在。需要一定的转换时间,但是因为可以预估,所以界面上可以做一个转换进度来降低用户的主观等待时间。
PS:至于你是把转换后的数据存到文件进行访问,还是用映射的方式把文件映射到内存来读写,实质上差不多,不过后者可能有系统提供的缓存机制来提高效率。但是本质上一样的:转换成临时文件、使用;或者干脆就是用专门的程序转换出新文件,再用处理程序去处理。看场合了。
如果你的文件是存储在顺序存储器中,比如磁带上:
那么差不多意思,想办法把数据转存到你的磁盘上,然后再进行随机访问。
补充::::关于内存映射:见上面的PS内容,先把文件转成可随机访问格式(比如我说要哪一行数据,你就立刻能找到/算出,而不是从头一行一行去找),然后再做内存映射。
另外,Windows下和Linux下的内存映射有所不同,但是基本上不难,可以直接搜索找到照搬。
⑽ 怎么用C语言定义一个无限长的数组
C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。
比如int a[] = {1,2,3,4,5}; 数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。
但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。
1 由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。
通过下面例子来理解该方法:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
intsize=100;//最初为100个元素空间。
int*a=NULL;
inti=0;
a=malloc(sizeof(int)*size);
if(a==NULL)return-1;
while(scanf("%d",a+i)==1)//循环向a中输入数据,直到输入非数值字符为止
{
i++;
if(i==size)//数组空间不足
{
size*=2;//将数组空间扩大二倍,也可以改用size+=100;之类的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空间
if(a==NULL)
{
return-1;//这种情况下运行载体(如PC)内存不足以提供,中断程序。
}
}
}
if(a)free(a);//对申请的内存进行释放。
return0;
}
从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。 直到占满所有剩余空间。
如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。
所以这种方法可以做到软件意义上的无限大数组空间。
但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。
2 事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。