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的數組,並對其操作。這樣在操作范圍內,這個就是一個「無限長」的數組了。