① C語言用數組存儲大型數據的演算法
樓主一定懂c++吧?c++標准庫裡面有一個模板類叫
bitset<>
專門用來做位操作的。
你的問題用這個可以高效的解決,建立一個足夠大的空間,比如8000個位
bitset<8000>
然後就簡單了,乘法函數把乘數轉化成bitset<32>類型的對象(用乘數直接初始化代表乘數的bitset<32>對象)然後用位運算符把被乘數(那個bitset<8000>類型的對象)按位右移,(一個10進制數右移一次相當於乘10,一個2進制數右移一次相當於乘2;乘數中,二進制位如果知道它是從右數第n位,那麼就把被乘數向右移動n-1位就完成了乘法,然後再做下一個二進制位的乘法,直到被乘數中所有的2進制位都被使用過為止)。做完了每32位2進制位轉化成一個unsigned long,存儲在一個鏈表或者數組(懷疑空間不夠,內存里很有可能沒有這么大的連續空間)中,如果按順序逐個輸出就是問題的結果。
我覺得這個方法比2樓的高效。
如果你不想使用c++標准庫……那也可以考慮用c中的位域,也支持位操作。不過遠沒有前面的方便,很多操作都要自己做,比如最基本的你必須有一個適合乘法操作的動態增長的位域組成的鏈表。而且即使這樣還不一定高效。
……寫完了才看的3樓,3樓就做得很好了。
只能分塊處理了,讀入一塊、處理一塊、存儲一塊,資料庫就是這么乾的。
③ c語言文件處理:大數據排序,我知道用ftell,fwrite...歸並排序,但如何實現
如果你不想把硬碟搞壞,不要直接操作文件讀寫排序,大數據而且速度也會很慢。
建議把文件數據讀入到動態分配內存,再進行數據排序,排序完成後,再寫入到文件,這樣做速度性能快。按你代碼那樣不停讀寫硬碟來實現排序,是非常不好的方式,因為硬碟是比較慢的設備,導致程序排序起來非常慢,頻繁讀寫硬碟對硬碟壽命也有影響。
排序方法有很多種,快速排序在大數據排序方面性能比較理想。
④ C語言讀取大數據文件以及數據組裝
我知道一個大數據的類型:int64。 用來定義數據的可以試是比較大的。
⑤ C語言基礎,大數據的輸入和輸出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX101
intcheck(char*a){
inti,n,k=1;
n=strlen(a);
for(i=0;i<n;i++)
(a[i]>'9'||a[i]<'0'){
k=0;
break;
}
returnk;
}
intplus(char*a,char*b,int*s){
inti,j,n,m,t,k=0;
//printf("%s %s ",a,b);
i=strlen(a)-1;
j=strlen(b)-1;
t=0;
while(i>=0&&j>=0){
t=t+a[i--]-'0'+b[j--]-'0';
s[k++]=t%10;
t=t/10;
}
if(t&&(i!=j))
s[k]=t;
if(t&&(i==j))
s[k++]=t;
while(i>=0){
s[k]+=a[i--]-'0';
k++;
}
while(j>=0){
s[k]+=b[j--]-'0';
k++;
}
for(i=k-1;i>=0;i--){
printf("%d",s[i]);
}
printf(" ");
returnk;
}
intmain(intargc,char*argv[]){
chara[MAX],b[MAX];
intc[MAX+2]={0};
scanf("%s%s",&a,&b);
//printf("%s %s ",a,b);
if(check(a)&&check(b))
plus(a,b,c);
else
printf("error ");
return0;
}
⑥ 如何使用C語言實現大數據體的動態讀取與處理
在內存中開辟兩個緩存區,大小?比如每個緩存32M,然後將數據讀入輸入緩存處理版,處理後的結果送輸權出緩存
這里的關鍵問題是如何對緩存進行管理?總體思路是,當緩存中有數據時,則取數據進行處理,處理好後放輸出緩存,同時還必須檢測,當輸出緩存數據快滿時,能夠及時將數據送入硬碟。。。
上面是大體思路,實際中,一般運用多線程處理這種情況,即一個線程負責管理輸入緩存,一個線程負責管理輸出緩存,第三個線程負責數據處理。。。具體管理策略有很多,你需要綜合各種因素(比如時間寬余度等)來決定。。。
⑦ 用C語言如何實現大數據的加法,且是包括整數和小數的運算
剛寫的 看看符合你要求不
#include<stdio.h>
#include<string.h>
typedefstruct
{
inta[200];
intb[200];
}NUM;
voidformat_num(NUM*n,char*str)
{
char*p_dot=NULL;
char*p;
inti=0;
memset(n,0,sizeof(*n));
for(p=str;*p;p++)
if(*p=='.')break;
if(*p)p_dot=p;
p--;
while(p>=str)
{
n->a[i++]=*p---'0';
}
p=p_dot;
if(p==NULL)return;
i=0;
p++;
while(*p)
n->b[i++]=*p++-'0';
}
voidprint_num(NUM*n)
{
inti,j;
for(i=sizeof(n->a)/sizeof(n->a[0])-1;i>=0;i--)
if(n->a[i])break;
if(i>=0)
for(;i>=0;i--)
printf("%d",n->a[i]);
elseprintf("0");
for(i=sizeof(n->b)/sizeof(n->b[0])-1;i>=0;i--)
if(n->b[i])break;
if(i>=0)
{
printf(".");
for(j=0;j<=i;j++)
printf("%d",n->b[j]);
}
}
voidadd(NUM*a,NUM*b,NUM*c)
{
intt=0;
inti;
for(i=sizeof(a->b)/sizeof(a->b[0])-1;i>=0;i--)
{
t+=a->b[i]+b->b[i];
c->b[i]=t%10;
t/=10;
}
for(i=0;i<sizeof(a->a)/sizeof(a->a[0]);i++)
{
t+=a->a[i]+b->a[i];
c->a[i]=t%10;
t/=10;
}
}
intmain()
{
charsa[100],sb[100];
NUMa,b,c;
scanf("%s%s",sa,sb);
format_num(&a,sa);
format_num(&b,sb);
print_num(&a);
printf("+");
print_num(&b);
printf("=");
add(&a,&b,&c);
print_num(&c);
printf(" ");
return0;
}
⑧ C語言大數據問題
給你提個思路吧,這種大數據都必須用數組來做的。把數字直接定內義成數組,然後將容轉換規則寫成代碼,而不是直接用取余或取整來做。我給你上傳一個大數加法的代碼,給你些啟發吧。想要代碼可以先採納我,然後我給你寫一個進制轉換的代碼。你這分太少,多些我會直接給你寫個代碼的。
⑨ 怎麼用c語言處理大數據
只要內存夠大,可以讀取2萬行數據的,我上次寫了個程序讀取了240萬條數據到內存之中。
你只要用getline函數,和strtok函數配合使用就行了,只能讀取6000行數據可能是你程序寫的有問題。
⑩ 用C語言實現求一個大數據如(2的63次方)的絕對值
整數:輸抄入-2^63 ~ +2^63數據並取絕對值
unsigned long long int x;
scanf("%lld",&x); if ( x<0 ) x=-x;
printf("%lld",x);
如果是浮點數精度只能達到16位了。