當前位置:首頁 » 編程語言 » c語言大數據運算
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言大數據運算

發布時間: 2022-11-07 13:00:49

⑴ 求c語言大數運算代碼

精度計算——除法(C++的,跟C很類似)char big_compare (char* a, char* b, int la, int lb) //除法輔助函數{ int i; if (la!=lb) return la-lb;
for (i=0;i<la;i++) if(a[i]!=b[i]) return a[i]-b[i];
return 0;}
參數說明:a,b是除數和被除數 c是商數,d是余數 la,lb,lc,ld 分別是a,b,c,d的長度int big_div (char* a, char* b, char* c, char* d, int la, int lb, int lc, int ld) // c = a/b; must lc >= la-lb+1 && ld >= lb{ int i,t,lr; char* r; memset(c,0,sizeof(char)*lc); //把c數組清成0 t = la-lb+1; lr = lb -1; r = d+ld-lr; for (i=0;i<lr;i++) r[i] = a[i]; while (t>0) { for (i=0;i<lr;i++) r[i-1] = r[i]; r[lr-1] = a[la-t]; lr++; r--; if (!*r) {r++; lr--;} int s = 0; while (big_compare(r,b,lr,lb)>=0) { s++; big_sub(r,b,lr,lb); if (!*r) {r++; lr--;} } c[lc-t] = s; //cout<<"s = "<<s<<" ."<<endl; t--; }
return true;}精度計算——加法語法:add(char a[],charb[],char s[]);參數: a[]:被乘數,用字元串表示,位數不限 b[]:乘數,用字元串表示,位數不限 t[]:結果,用字元串表示返回值:null注意: 空間復雜度為 o(n^2) 需要 string.h源程序: void add(char a[],char b[],char back[]){int i,j,k,up,x,y,z,l;char *c;if (strlen(a)>strlen(b)) l=strlen(a)+2; elsel=strlen(b)+2;c=(char *) malloc(l*sizeof(char));i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i>=0||j>=0){if(i<0) x='0'; else x=a[i];if(j<0) y='0'; else y=b[j];z=x-'0'+y-'0';if(up) z+=1;if(z>9) {up=1;z%=10;} else up=0;c[k++]=z+'0';i--;j--;}if(up) c[k++]='1';i=0;c[k]='\0';for(k-=1;k>=0;k--)back[i++]=c[k];back[i]='\0';} 精度計算——減法語法sub(char s1[],chars2[],char t[]);參數: s1[]:被減數,用字元串表示,位數不限 s2[]:減數,用字元串表示,位數不限 t[]:結果,用字元串表示返回值:null注意: 默認s1>=s2,程序未處理負數情況需要 string.h源程序: void sub(char s1[],chars2[],char t[]){int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);t[l1]='\0';l1--;for (i=l2-1;i>=0;i--,l1--){if (s1[l1]-s2[i]>=0) t[l1]=s1[l1]-s2[i]+'0';else{t[l1]=10+s1[l1]-s2[i]+'0';s1[l1-1]=s1[l1-1]-1;}}k=l1;while(s1[k]<0) {s1[k]+=10;s1[k-1]-=1;k--;}while(l1>=0) {t[l1]=s1[l1];l1--;}loop:if (t[0]=='0') {l1=strlen(s1);for (i=0;i<l1-1;i++) t[i]=t[i+1];t[l1-1]='\0';goto loop;}if (strlen(t)==0) { t[0]='0';t[1]='\0';}}
精度計算——乘法(大數乘小數)語法:mult(char c[],chart[],int m);參數: c[]:被乘數,用字元串表示,位數不限 t[]:結果,用字元串表示 m:乘數,限定10以內返回值:null 注意: 需要 string.h源程序: void mult(char c[],chart[],int m){int i,l,k,flag,add=0;char s[100];l=strlen(c);for (i=0;i<l;i++)s[l-i-1]=c[i]-'0'; for (i=0;i<l;i++){k=s[i]*m+add;if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;}}if (flag) {l=i+1;s[i]=add;} else l=i;for (i=0;i<l;i++)t[l-1-i]=s[i]+'0';t[l]='\0';} 精度計算——乘法(大數乘大數)語法:mult(char a[],charb[],char s[]);參數: a[]:被乘數,用字元串表示,位數不限 b[]:乘數,用字元串表示,位數不限 t[]:結果,用字元串表示返回值:null注意: 空間復雜度為 o(n^2) 需要 string.h源程序: void mult(char a[],charb[],char s[]){int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;char result[65];alen=strlen(a);blen=strlen(b); for (i=0;i<alen;i++)for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0');for (i=alen-1;i>=0;i--){for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];result[k]=sum%10;k=k+1;sum=sum/10;}for (i=blen-2;i>=0;i--){for (j=0;j<=i;j++) sum=sum+res[i-j][j];result[k]=sum%10;k=k+1;sum=sum/10;}if (sum!=0) {result[k]=sum;k=k+1;}for (i=0;i<k;i++) result[i]+='0';for (i=k-1;i>=0;i--) s[i]=result[k-1-i];s[k]='\0';while(1){if (strlen(s)!=strlen(a)&&s[0]=='0') strcpy(s,s+1);elsebreak;}} </p>

⑵ c語言處理文件里的大數據

C語言處理大數據一般有三種處理方法:
1、分段處理,即無論文件多大,程序中使用的永遠只是一小段部分,可以使用一個緩沖區,根據用戶交互輸入,分段的輸出。
2、使用內存文件映射,這是最常用的文件的處理方法,Linux和Windows都提供一種內存文件映射的機制,以Windows為例,可以調用 CreateFile()、 CreateFileMapping()以及 MapViewOfFile()三個函數來完成內存文件映射。
3、使用資料庫,藉助SQL查詢語言對大數據進行操作。

⑶ c語言里很大的數(比如十萬)怎麼運算啊

可以自己編一個演算法去實現阿,要從輸入就開始,要不然村都沒辦法存.
//fileheader.h
#ifndef FILEHEADER_H_
#define FILEHEADER_H_
/*
* 文件名稱:fileheader.h
* 摘要:任意長度的兩個整數相加
*
* 當前版本:1.0
* 作者:呂翔
* 完成日期:2009年3月1日
*/
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
class LinkList
{
public:
LinkList();
void ListIn(string str);
void SetSymbol(bool temp);
bool GetSymol();
int FirstNode();
int TailNode();
void Insert(int n);
void GetStr();
int GetSize();
int GetLastN(int n);
int GetFirstN(unsigned int n);
private:
bool symbol;
vector<int> number;
};
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
class Control
{
public:
static void compute(LinkList *pAdd1, LinkList *pAdd2, LinkList *pSum);
};
#endif
//LinkList.cpp
#include "fileheader.h"
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
LinkList::LinkList()
{
symbol=0;
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
int LinkList::FirstNode()
{
return(number[0]);
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
bool LinkList::GetSymol()
{
return(symbol);
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
void LinkList::Insert(int n)
{
number.push_back(n);
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
int LinkList::TailNode()
{
return(number[number.size()-1]);
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
void LinkList::SetSymbol(bool temp)
{
symbol=temp;
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
void LinkList::GetStr()
{
if (symbol)
{
cout<<"-";
}
bool flag=0;
for (int i=number.size()-1; i>=0; i--)
{
if (number[i]==0 && flag==0);
else
{
cout<<number[i];
flag=1;
}
}
if (!flag)
cout<<'0';
cout<<endl;
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
void LinkList::ListIn(string str)
{
if (str[0]=='-')
symbol=1;
else
number.push_back(str[0]-48);
for (unsigned int i=1; i<str.size(); i++)
{
number.push_back(str[i]-48);
}
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
int LinkList::GetSize()
{
return (number.size());
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
int LinkList::GetLastN(int n)
{
int size=number.size();
if (size>=n)
return (number[size-n]);
else
return (0);
}
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
int LinkList::GetFirstN(unsigned int n)
{
if(number.size()>n)
return (number[n-1]);
else
return (0);
}
//control.cpp
#include "fileheader.h"
/*----------我----------是----------風----------騷----------的----------分----------割----------線----------*/
void Control::compute(LinkList *pAdd1, LinkList *pAdd2, LinkList *pSum)
{
if ((pAdd1->GetSymol()) == (pAdd2->GetSymol()))
{
pSum->SetSymbol(pAdd1->GetSymol());
int size=pAdd1->GetSize()>pAdd2->GetSize()?pAdd1->GetSize():pAdd2->GetSize();
bool carry=0;
for (int sum,i=1; i<=size; i++)
{
sum=pAdd1->GetLastN(i)+pAdd2->GetLastN(i)+carry;
carry=0;
if (sum>9)
{
sum=sum-10;
carry=1;
}
pSum->Insert(sum);
}
if (carry==1)
pSum->Insert(1);
}
else
{
int size=pAdd1->GetSize();
if (pAdd2->GetSize()>size)
{
size=pAdd2->GetSize();
LinkList *temp;
temp=pAdd2;
pAdd2=pAdd1;
pAdd1=temp;
}
else if (pAdd2->GetSize()==size)
{
int add1=0,add2=0;
for (int i=1; (add1 == add2) && i<=size; i++)
{
add1=pAdd1->GetFirstN(i);
add2=pAdd2->GetFirstN(i);
}
if (add1<add2)
{
size=pAdd2->GetSize();
LinkList *temp;
temp=pAdd2;
pAdd2=pAdd1;
pAdd1=temp;
}
}
pSum->SetSymbol(pAdd1->GetSymol());
bool carry=0;
for (int sum,i=1; i<=size; i++)
{
sum=pAdd1->GetLastN(i)-pAdd2->GetLastN(i)-carry;
carry=0;
if (sum<0)
{
sum=sum+10;
carry=1;
}
pSum->Insert(sum);
}
}
}
//main.cpp
#include "fileheader.h"
void main()
{
string strAdd1, strAdd2;
cin>>strAdd1;
cin>>strAdd2;
LinkList add1, add2;
add1.ListIn(strAdd1);
add2.ListIn(strAdd2);
LinkList *pAdd1=&add1, *pAdd2=&add2, sum, *pSum=∑
Control::compute(pAdd1, pAdd2, pSum);
sum.GetStr();
}
我自己寫的,任意大整數的加法,正負均可。

⑷ C語言用數組存儲大型數據的演算法

/*
size_a,pa——指向數組a的有效末端
ma——a的最大容量,必須大於na

n=12——求n的階
p——求階乘時的當前乘數
*/
#include<stdio.h>
#define Ma 10000
int pa;/*指向數組a的有效末端*/
int p=2;
int memory_over=0;
union data
{ unsigned long int b;
struct
{unsigned l:16;
unsigned h:16;
}m;
}a[Ma];
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明1:考慮到result比較長,我用a[Ma].b來存儲n!的result,每一位a[pa].b能存儲4位10進制數字。
因為我定義的數組是靜態的,所以Ma應該足夠大。
ps:其實只用定義一個unsigned long int b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考慮到可能會訪問每一結點b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考慮是多餘的!!不用像我這樣定義這么復雜的共用體!!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
unsigned int cashe;
unsigned int carry;

void main()
{
unsigned int n;/*求n的階*/
void facto(unsigned int n);
printf("Input n:");
scanf("%u",&n);
/*=================開始求階乘!=============*/
a[0].b=1;/*初始化*/
facto(n);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明2:上面這句直接調用facto(n)來求n!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*========================以下是顯示最後結果====================================*/
if(memory_over==0)
{printf("the result include %dNO:\n",pa+1);
printf("%u",a[pa--].m.l);
for(;pa>=0;pa--)
printf("%04u",a[pa].m.l);
printf("\n");
}
getch();
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
演算法說明2:求階函數facto(n)說明:
這個函數會不斷地調用multiple(),它的作用是每被調用一次就使得a[pa].b與階數p相乘一次,直到乘完n為止!
{multiple();
p++;/*每一輪乘一個階數p*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void facto(unsigned int n)
{void multiple();
pa=0;
while(pa<Ma-1&&p<=n)/*容量限制*/
{multiple();
p++;/*每一輪乘一個階數p*/
}
if(p<=n)
{printf("memory out!\n");memory_over=1;}/*如果當前的存儲結果的數組a[Ma]不夠用!應提高Ma*/

}

/*==============================================================================
演算法說明3:乘法函數multiple()說明:負責a[pa].b與階數p相乘。
a[pa].b有很多結點,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。
當然是從低結點a[0].b開始不斷與p相乘,產生的「進位」加到高位a[1].b,直到a[pa].b*p為止!

隨著結果數值增大,pa個結點的a[].b可能容納不下結果,所以如果a[pa].b與p相乘後還有「進位」carry,就擴大pa,並把carry放入到新增加的結點:
if(carry>0)
a[++pa].b=carry;
===================================================================================*/
void multiple()
{int i=0;
carry=0;
while(i<=pa)/*i指向當前處理的元素a[i],每一輪用一個位與階數p相乘*/
{a[i].b=a[i].b*p+carry;/*計算結果,要考慮來自低位的進位*/
carry=a[i].b/10000;/*計算進位*/
a[i].b=a[i].b%10000;/*計算余數*/
i++;
}
if(carry>0)
a[++pa].b=carry;
}

⑸ C語言大整數的四則運算

#include<stdio.h>
intmul(inta[],intk)
{inti,t=0;
for(i=1;i<=a[0];i++)
{a[i]=k*a[i]+t;
t=a[i]/10;
a[i]%=10;
}
for(i=a[0];t;)
{a[++a[0]]=t%10;
t/=10;
}
}
intmain()
{inti,n,a[102]={1,1};
scanf("%d",&n);
printf("%d!=",n);
for(i=2;i<=n;i++)
mul(a,i);
for(i=a[0];i>0;i--)
printf("%d",a[i]);
return0;
}

⑹ C語言中如何實現大數計算

/*關於任意精度大數的高精度求冪運算

在以前的文章中看到介紹一種演算法,就是使用10000進製法,用數組來存儲數據。
原理如下:
先說計數方法:
十進制和其他進制都是用權和數字(好象這里名詞不對,記不清楚了)來計數的:
比如

num=123456790
這個數的大小就是:
0*10^0+9*10^1+7*10^2+...+1*10^8
我們可以這樣來寫這個數:
123 456 790
令a=123,b=456,c=790
那麼,abc看起來就象和123456790是一樣的

看到這里你明白了吧?
我們可以分段表示一個非常大的數而不必考慮它的溢出,
而只用考慮段數是否大於一個數即可
舉個例子:
上邊,a的最大值是999,bc也同樣都是,我們只用保證這三個數不溢出
那麼,num就不會溢出

再一個乘法.

我們老祖宗給我們留下的算盤,很妙,
它其實就是最基本的計算機之一

我們算乘方時,
只用乘以一個數:
這樣來列式子:
123456790
*2=
--------------
246913580

即:
123 456 790
*2= *2= *2=
----- ----- ------
246 912 (1)580(溢出) 第三段有溢出,加到上一段
----- ----- --------
246 913 580

呵呵,就這樣,打算盤一樣,進位.

至此,我們已經將需要計算的溢出和乘方計算問題解決了,只用看代碼了:
程序用一個含有1024個無符號整數(上限65536)的數組來存放各段數據
每一個數是一段,每一個數據可以表示9999這么大的數(便於進位)
計算一次,檢查是否超過9999,如果超過,把這一段減去10000,
然後向上一個位(即上一個數)進1(這可以稱為 "一萬進制 ")
程序可以計算小於2的13605次方,大於0次方的任意的二的乘方

其實這樣算起來一點也沒有必要,不過,我覺得好玩,過癮.
另外,藉助對數,可以很輕松的算出這些來,
相比之下,本程序無任何誤差而已

我稱這個演算法為 " '一萬進制 '算盤法 ":

*/
#include "stdio.h "
int main(void)
{
static unsigned int temp[1024];/*分段儲存數據*/
unsigned int position=1;/*記錄共有幾段*/
int overflow=0; /*記錄在算每一段時是否溢出*/
long
times=10000,tm_cnt,sgn_cnt;/*默認10000次計算,可以更改,兩個計數器(乘方次數,段的位置)*/
temp[0]=2;/*初始值為2*/
if(times> 13000)
{
printf( "your input is too large ");/*檢查輸入是否越界*/
exit(0);
}
/*開始計算,外層為乘方次數,內層為每一位計算*/
for(tm_cnt=0;tm_cnt <times-1;tm_cnt++)
{
for(sgn_cnt=0;sgn_cnt <position;sgn_cnt++)
{

temp[sgn_cnt] < <=1;/*相當於乘2*/
if(overflow==1) /*檢查上次是否有溢出*/
{
/*有的話,將溢出加到這一段,同時置溢出為0*/
++temp[sgn_cnt];
overflow=0;
}

if(temp[sgn_cnt]> 9999)
{
/*檢查本次是否溢出,溢出的話,*/
temp[sgn_cnt]-=10000;
overflow=1;
}

}
if(overflow==1)
{
++position;
++temp[sgn_cnt];
overflow=0;
}
if(position> 1023)
{

printf( "times: %d error! ",tm_cnt);
exit(1);
}
}

printf( "%d ",temp[sgn_cnt-1]);
for(sgn_cnt=position-2;sgn_cnt> =0;sgn_cnt--)
{
if(temp[sgn_cnt] <1000)
printf( "0 ");
if(temp[sgn_cnt] <100)
printf( "0 ");
if(temp[sgn_cnt] <10)
printf( "0 ");
printf( "%d ",temp[sgn_cnt]);
if((sgn_cnt+1)%15==0)
printf( "\n ");
}
return 0;
}

2的1000次方:
199 5063 1168 8075
8384 8837 4216 2683 5850 8382 3496 8318 8619 2454 8520 0894 9852 9438 8302
2194 6631 9199 6168 4036 1945 9789 9331 1294 2320 9124 2715 5649 1349 4137
8111 7593 7859 3209 6323 9578 5573 0046 7937 9452 6765 2465 5126 6059 8955
2055 0086 9181 9331 1542 5086 0846 0618 1046 8550 9074 8660 8962 4888 0904
8989 4838 0092 5394 1633 2578 5062 1568 3094 7390 2556 9123 8806 5225 0966
4387 4441 0467 5987 1626 9854 5322 2868 5381 6169 4315 7756 2964 0762 8368
8076 0732 2285 3509 1641 4761 8395 6381 4589 6946 3899 4108 4096 0536 2678
2106 4621 4273 3339 4036 5255 6564 9530 6031 4268 0234 9694 0033 5934 3166
5145 9297 7732 7966 5775 6061 7258 2031 4079 9419 8179 6073 7824 5683 7622
8003 7302 8854 8725 1900 8344 6458 1454 6505 5792 9601 4148 3392 1615 7345
8813 9257 0953 7976 9119 2778 0082 6957 7356 7444 4123 0620 1875 7836 3255
0272 8323 7892 7071 0373 8028 6639 3031 4281 3324 1401 6241 9567 1690 5740
6141 9654 3423 2463 8801 2488 5614 7305 2074 3199 2259 6117 9625 0130 9928
6024 1708 3408 0760 5932 3201 6126 8492 2884 9625 5841 3128 4406 1536 7389
5148 7114 2563 1511 1089 7455 1420 3313 8202 0293 1640 9575 9646 4756 0104
0584 5841 5660 7204 4962 8670 1651 5061 9206 3100 4186 4222 7590 8670 9005
7460 6417 8569 5191 1456 0550 6825 1250 4060 0751 9842 2618 9805 9237 1180
5444 4788 0729 0639 5242 5483 3922 1982 7074 0447 3162 3767 6084 6613 0337
7870 6039 8034 1319 7133 4936 5462 2700 5631 6993 7455 5082 4178 0972 8109
8329 1314 4035 7187 7524 7685 0985 7276 9379 2643 3221 5993 9987 6886 6608
0836 8837 8380 2764 3282 7751 7227 3657 5727 4478 4112 2943 8973 3810 8616
0742 3253 2919 7481 3120 1976 0417 8281 9656 9747 5898 1645 3125 8434 1359
5986 2784 1301 2818 5406 2834 7664 9088 6905 2104 7580 8826 1582 3961 9857
7012 2407 0443 3058 3075 8690 3931 9604 6034 0497 3156 5832 0867 2105 9133
0090 3752 8234 1553 9745 3943 9771 5257 4552 9051 0212 3109 4732 1610 7534
7482 5740 7752 7398 6348 2984 9834 0756 9379 5564 6638 6218 7456 9499 2790
1657 2103 7013 6443 3135 8172 1431 1791 3982 2298 3845 8473 3444 0270 9641
8285 1005 0729 2774 8364 5505 7863 4501 1008 5298 7812 3894 7392 8699 5408
3434 6158 8070 4395 9118 9858 1514 5779 1771 4361 9698 7281 3145 9483 7832
0208 1474 9821 7185 8011 3890 7122 8250 9058 2681 7436 2205 7747 5921 4176
5371 5687 7256 1490 4582 9049 9246 1028 6300 8153 5583 3081 3010 1987 6758
5623 4343 5389 5540 9175 6234 0084 4887 6264 3568 6488 3351 9463 7203
7729 3240 0944 5624 6923 2543 5040 0678 0272 7383 7755 3764 0672 6898 6362
4103 7491 4109 6671 8557 0507 5909 8100 2467 8988 0178 2719 2595 3381 2824
2195 4028 3027 5940 8448 9550 1467 6668 3896 9799 6886 2416 3631 3376 3939
0337 3455 8014 0763 6741 8777 1105 5384 2257 3949 9110 1864 6821 9696 5816
5148 5130 4942 2236 9947 7147 6306 9155 4682 1768 2876 2003 6277 7257 7237
8136 5331 6111 9681 1280 7926 6948 1887 2012 9864 3660 7685 5163 9860 5346
0229 7871 5575 1794 7385 2463 6944 6923 0878 9426 5948 2170 0805 1120 3223
6549 6288 1690 3573 9121 3683 3839 3591 7564 1873 3850 5109 7027 1613 9154
3959 0991 5981 5465 4417 3363 1165 6936 0311 2224 9937 9699 9922 6781 7323
5802 3111 8626 4457 5299 1357 5817 5008 1998 3923 6284 6152 4988 1088 9602
3224 4362 1737 7161 8086 3570 1546 8484 0586 2232 9792 8538 7562 3486 5564
4053 6962 6220 1896 3571 0288 1236 1567 5125 4333 8303 2700 2909 7668 6505
6855 7157 5055 1672 7518 8991 9412 9711 3376 9014 9916 1813 1517 1544 0077
2865 0573 1895 5745 0920 3301 8530 4847 1138 1831 5407 3240 5331 9038 4620
8403 6421 7637 0391 1550 6397 8900 0742 8536 7219 6280 9034 7797 4533 3204
6836 8795 8685 8023 7952 2186 2912 0080 7428 1955 1317 9481 5762 4448 2985
1846 1509 7048 8802 7274 7215 7468 8131 5947 5040 9732 1150 8049 8190 4558
0341 6826 9497 8714 1316 0632 1068 6391 5116 8177 4304 7925 9670 9376

⑺ 用C語言實現大數據的加減運算(基本類型無法儲存的大數據,使用字元串解決)。

#include"stdio.h"
#include<string.h>
intmain(intargv,char*argc[]){
chara[]="";
charb[]="",*pa,*pb;
inti,j,k,la,lb;
if((la=strlen(a))>=(lb=strlen(b)))
pa=a,pb=b;
else{
pa=b,pb=a;
i=la,la=lb,lb=i;
}
printf("%s+%s =",a,b);
for(i=la-1,j=lb-1;j>=0;pa[i--]+=pb[j--]-'0');
for(i=la-1;i>0;i--)
if(pa[i]>'9')
pa[i]-=10,pa[i-1]++;
if(pa[0]>'9'){
printf("1");
pa[0]-=10;
}
else
for(;pa[i]=='0';i++);
printf("%s ",pa+i);
printf(" %s-%s =",a,b);
for(i=la-1,j=lb-1;j>=0;pa[i--]-=pb[j--]-'0');
for(i=la-1;i>0;i--)
if(pa[i]<'0')
pa[i]+=10,pa[i-1]--;
if(pa[0]<'0'){
printf("-");
pa[0]+=1;
}
else
for(;pa[i]=='0';i++);
printf("%s ",pa+i);
return0;
}

運行結果:

⑻ 用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語言 實現大數的計算

/*關於任意精度大數的高精度求冪運算 在以前的文章中看到介紹一種演算法,就是使用10000進製法,用數組來存儲數據。 原理如下: 先說計數方法: 十進制和其他進制都是用權和數字(好象這里名詞不對,記不清楚了)來計數的: 比如 num=123456790 這個數的大小就是: 0*10^0+9*10^1+7*10^2+...+1*10^8 我們可以這樣來寫這個數: 123 456 790 令a=123,b=456,c=790 那麼,abc看起來就象和123456790是一樣的 看到這里你明白了吧? 我們可以分段表示一個非常大的數而不必考慮它的溢出, 而只用考慮段數是否大於一個數即可 舉個例子: 上邊,a的最大值是999,bc也同樣都是,我們只用保證這三個數不溢出 那麼,num就不會溢出 再一個乘法. 我們老祖宗給我們留下的算盤,很妙, 它其實就是最基本的計算機之一 我們算乘方時, 只用乘以一個數: 這樣來列式子: 123456790 *2= -------------- 246913580 即: 123 456 790 *2= *2= *2= ----- ----- ------ 246 912 (1)580(溢出) 第三段有溢出,加到上一段 ----- ----- -------- 246 913 580 呵呵,就這樣,打算盤一樣,進位. 至此,我們已經將需要計算的溢出和乘方計算問題解決了,只用看代碼了: 程序用一個含有1024個無符號整數(上限65536)的數組來存放各段數據 每一個數是一段,每一個數據可以表示9999這么大的數(便於進位) 計算一次,檢查是否超過9999,如果超過,把這一段減去10000, 然後向上一個位(即上一個數)進1(這可以稱為 "一萬進制 ") 程序可以計算小於2的13605次方,大於0次方的任意的二的乘方 其實這樣算起來一點也沒有必要,不過,我覺得好玩,過癮. 另外,藉助對數,可以很輕松的算出這些來, 相比之下,本程序無任何誤差而已 我稱這個演算法為 " '一萬進制 '算盤法 ": */ #include "stdio.h " int main(void) { static unsigned int temp[1024];/*分段儲存數據*/ unsigned int position=1;/*記錄共有幾段*/ int overflow=0; /*記錄在算每一段時是否溢出*/ long times=10000,tm_cnt,sgn_cnt;/*默認10000次計算,可以更改,兩個計數器(乘方次數,段的位置)*/ temp[0]=2;/*初始值為2*/ if(times> 13000) { printf( "your input is too large ");/*檢查輸入是否越界*/ exit(0); } /*開始計算,外層為乘方次數,內層為每一位計算*/ for(tm_cnt=0;tm_cnt <times-1;tm_cnt++) { for(sgn_cnt=0;sgn_cnt <position;sgn_cnt++) { temp[sgn_cnt] < <=1;/*相當於乘2*/ if(overflow==1) /*檢查上次是否有溢出*/ { /*有的話,將溢出加到這一段,同時置溢出為0*/ ++temp[sgn_cnt]; overflow=0; } if(temp[sgn_cnt]> 9999) { /*檢查本次是否溢出,溢出的話,*/ temp[sgn_cnt]-=10000; overflow=1; } } if(overflow==1) { ++position; ++temp[sgn_cnt]; overflow=0; } if(position> 1023) { printf( "times: %d error! ",tm_cnt); exit(1); } } printf( "%d ",temp[sgn_cnt-1]); for(sgn_cnt=position-2;sgn_cnt> =0;sgn_cnt--) { if(temp[sgn_cnt] <1000) printf( "0 "); if(temp[sgn_cnt] <100) printf( "0 "); if(temp[sgn_cnt] <10) printf( "0 "); printf( "%d ",temp[sgn_cnt]); if((sgn_cnt+1)%15==0) printf( "\n "); } return 0; } 2的1000次方: 199 5063 1168 8075 8384 8837 4216 2683 5850 8382 3496 8318 8619 2454 8520 0894 9852 9438 8302 2194 6631 9199 6168 4036 1945 9789 9331 1294 2320 9124 2715 5649 1349 4137 8111 7593 7859 3209 6323 9578 5573 0046 7937 9452 6765 2465 5126 6059 8955 2055 0086 9181 9331 1542 5086 0846 0618 1046 8550 9074 8660 8962 4888 0904 8989 4838 0092 5394 1633 2578 5062 1568 3094 7390 2556 9123 8806 5225 0966 4387 4441 0467 5987 1626 9854 5322 2868 5381 6169 4315 7756 2964 0762 8368 8076 0732 2285 3509 1641 4761 8395 6381 4589 6946 3899 4108 4096 0536 2678 2106 4621 4273 3339 4036 5255 6564 9530 6031 4268 0234 9694 0033 5934 3166 5145 9297 7732 7966 5775 6061 7258 2031 4079 9419 8179 6073 7824 5683 7622 8003 7302 8854 8725 1900 8344 6458 1454 6505 5792 9601 4148 3392 1615 7345 8813 9257 0953 7976 9119 2778 0082 6957 7356 7444 4123 0620 1875 7836 3255 0272 8323 7892 7071 0373 8028 6639 3031 4281 3324 1401 6241 9567 1690 5740 6141 9654 3423 2463 8801 2488 5614 7305 2074 3199 2259 6117 9625 0130 9928 6024 1708 3408 0760 5932 3201 6126 8492 2884 9625 5841 3128 4406 1536 7389 5148 7114 2563 1511 1089 7455 1420 3313 8202 0293 1640 9575 9646 4756 0104 0584 5841 5660 7204 4962 8670 1651 5061 9206 3100 4186 4222 7590 8670 9005 7460 6417 8569 5191 1456 0550 6825 1250 4060 0751 9842 2618 9805 9237 1180 5444 4788 0729 0639 5242 5483 3922 1982 7074 0447 3162 3767 6084 6613 0337 7870 6039 8034 1319 7133 4936 5462 2700 5631 6993 7455 5082 4178 0972 8109 8329 1314 4035 7187 7524 7685 0985 7276 9379 2643 3221 5993 9987 6886 6608 0836 8837 8380 2764 3282 7751 7227 3657 5727 4478 4112 2943 8973 3810 8616 0742 3253 2919 7481 3120 1976 0417 8281 9656 9747 5898 1645 3125 8434 1359 5986 2784 1301 2818 5406 2834 7664 9088 6905 2104 7580 8826 1582 3961 9857 7012 2407 0443 3058 3075 8690 3931 9604 6034 0497 3156 5832 0867 2105 9133 0090 3752 8234 1553 9745 3943 9771 5257 4552 9051 0212 3109 4732 1610 7534 7482 5740 7752 7398 6348 2984 9834 0756 9379 5564 6638 6218 7456 9499 2790 1657 2103 7013 6443 3135 8172 1431 1791 3982 2298 3845 8473 3444 0270 9641 8285 1005 0729 2774 8364 5505 7863 4501 1008 5298 7812 3894 7392 8699 5408 3434 6158 8070 4395 9118 9858 1514 5779 1771 4361 9698 7281 3145 9483 7832 0208 1474 9821 7185 8011 3890 7122 8250 9058 2681 7436 2205 7747 5921 4176 5371 5687 7256 1490 4582 9049 9246 1028 6300 8153 5583 3081 3010 1987 6758 5623 4343 5389 5540 9175 6234 0084 4887 6264 3568 6488 3351 9463 7203 7729 3240 0944 5624 6923 2543 5040 0678 0272 7383 7755 3764 0672 6898 6362 4103 7491 4109 6671 8557 0507 5909 8100 2467 8988 0178 2719 2595 3381 2824 2195 4028 3027 5940 8448 9550 1467 6668 3896 9799 6886 2416 3631 3376 3939 0337 3455 8014 0763 6741 8777 1105 5384 2257 3949 9110 1864 6821 9696 5816 5148 5130 4942 2236 9947 7147 6306 9155 4682 1768 2876 2003 6277 7257 7237 8136 5331 6111 9681 1280 7926 6948 1887 2012 9864 3660 7685 5163 9860 5346 0229 7871 5575 1794 7385 2463 6944 6923 0878 9426 5948 2170 0805 1120 3223 6549 6288 1690 3573 9121 3683 3839 3591 7564 1873 3850 5109 7027 1613 9154 3959 0991 5981 5465 4417 3363 1165 6936 0311 2224 9937 9699 9922 6781 7323 5802 3111 8626 4457 5299 1357 5817 5008 1998 3923 6284 6152 4988 1088 9602 3224 4362 1737 7161 8086 3570 1546 8484 0586 2232 9792 8538 7562 3486 5564 4053 6962 6220 1896 3571 0288 1236 1567 5125 4333 8303 2700 2909 7668 6505 6855 7157 5055 1672 7518 8991 9412 9711 3376 9014 9916 1813 1517 1544 0077 2865 0573 1895 5745 0920 3301 8530 4847 1138 1831 5407 3240 5331 9038 4620 8403 6421 7637 0391 1550 6397 8900 0742 8536 7219 6280 9034 7797 4533 3204 6836 8795 8685 8023 7952 2186 2912 0080 7428 1955 1317 9481 5762 4448 2985 1846 1509 7048 8802 7274 7215 7468 8131 5947 5040 9732 1150 8049 8190 4558 0341 6826 9497 8714 1316 0632 1068 6391 5116 8177 4304 7925 9670 9376

⑽ c語言中怎麼處理一個特別大的數據的運算

最簡單的辦法是將大數當作字元串進行處理,也就是將大數用10進制字元數組進行表示,

然後模擬人們手工進行「豎式計算」的過程編寫其加減乘除函數。但是這樣做效率很低,

因為1024位的大數其10進制數字個數就有數百個,對於任何一種運算,都需要在兩個有

數百個元素的數組空間上做多重循環,還需要許多額外的空間存放計算的進位退位標志

及中間結果。其優點是演算法符合人們的日常習慣,易於理解。