#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const int OneNode = 1000000 ;//一位里不能超過OneNode
const int NodeLen = 6 ;//一位儲存NodeLen位,和OneNode必須同時(shí)更改,輸出部分格式必須跟隨這里!!!
const int NumMax = 10005 ;//儲存位數(shù)限制,真實(shí)位數(shù)為NumMax*6
struct BigNum


{
unsigned num[NumMax] ;//高位 對 下標(biāo)大位
unsigned numlen ;

void set(unsigned sm=0)
{ num[0] = sm ; numlen = 1; }//sm<OneNode
void set(char *string , int strlen)

{
numlen = (strlen-1) / NodeLen + 1 ;
memset (num , 0 , sizeof(unsigned)*numlen );
int temp , i ;
for( i=strlen-1 ; i>=0 ; i-- )

{
temp = i / NodeLen ;
num[temp] = num[temp]*10 + string[strlen-1-i]-'0' ;
}
}
void print()

{
printf("%d",num[numlen-1]);
int i = numlen-1;
while( i )

{
i--;
printf("%06d",num[i]);
}
printf("\n");
}
};

void Add(BigNum &a,BigNum &b,BigNum &c) // a+b ->c


{
unsigned lenmax = a.numlen>b.numlen?a.numlen:b.numlen;
c.numlen = lenmax;
unsigned i,carry=0;
for ( i=0 ; i<lenmax ; i++ )

{
c.num[i] = carry ;
if( a.numlen > i )
c.num[i]+= a.num[i];
if( b.numlen > i )
c.num[i]+= b.num[i];
carry = c.num[i] / OneNode ;
c.num[i] %= OneNode ;
}
if ( carry )

{
c.num[i] = carry ;
c.numlen ++;
}
}

void Mul(BigNum &a,BigNum &b,BigNum &c) // a*b ->c


{
unsigned carry = 0 , lenmax = a.numlen+b.numlen-1 ,i,j ;
unsigned __int64 temp ;
c.numlen = lenmax;
for ( i=0 ; i<lenmax ; i++ )

{
temp = carry ;
for ( j=0 ; j<a.numlen ; j++ )

{
if ( i<j )
break;
if ( i-j >= b.numlen )

{
j = i-b.numlen ;
continue;
}
temp += (unsigned __int64)a.num[j] * b.num[i-j] ;
}
carry = temp / OneNode ;
c.num[i] = temp % OneNode ;
}
if(carry)

{
c.num[i] = carry ;
c.numlen ++;
}
while(c.numlen>1&&!c.num[c.numlen-1])
c.numlen--;
}

int Cmp(BigNum &a,BigNum &b) //a>b --> 1 , > --> -1 ,== --> 0


{
if( a.numlen>b.numlen )
return 1;
if( a.numlen<b.numlen )
return -1;
int len = a.numlen ;
while(len)

{
len --;
if(a.num[len]>b.num[len])return 1;
if(a.num[len]<b.num[len])return -1;
}
return 0;
}

void Cpy(BigNum &a , BigNum &b) //b-->a


{
a.numlen=b.numlen;
memcpy(a.num,b.num,sizeof(unsigned)*b.numlen);
}

void Sub( BigNum &a , BigNum b ) //a-b -> a , a>=b


{
unsigned i = 0;
unsigned carry = 0 ;
for ( i=0 ; i<b.numlen ; i++ )

{
a.num[i] = a.num[i]-carry-b.num[i];
if(a.num[i]>OneNode) //有進(jìn)位(由于相減如果小于0會向上溢出)

{
a.num[i] += OneNode ;
carry = 1;
}
else carry = 0;
}
while(carry)

{
if(a.num[i])

{
a.num[i] --;
carry = 0;
}
else

{
a.num[i] = OneNode-1;
i++;
}
}
while(a.num[a.numlen-1]==0 && a.numlen!=1)

{
a.numlen --;
}
}
void Div(BigNum &a,int b,int &l) // a/=b -> 余數(shù)l


{
int carry=0;
int i;
for(i=a.numlen-1;i>=0;i--)

{
a.num[i]+=carry*OneNode;
carry=a.num[i]%b;
a.num[i]/=b;
}
if(a.numlen>1&&!a.num[a.numlen-1])a.numlen--;
l=carry;
}


一個(gè)很BT的大數(shù)運(yùn)算。地址:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001。
因?yàn)榇a太長,所以分兩部分打開,上面是大數(shù)一部分的代碼
看看這個(gè)吧,我看完之后想死的心都有了。