大整數運算

2021-10-22 22:28:01 字數 3584 閱讀 8832

在c語言中,最大整型變數的範圍在−9×

1018→

9×10

18-9\times10^\to9\times 10^

−9×101

8→9×

1018

。有時候題目中資料的大小超過最大整型變數,我們不能用c語言自帶的變數型別,只能模擬加減乘除的過程。這就需要用到結構體來自定義乙個大整數(高精度整數)。

大整數儲存:

struct bign

}

由於大整數沒有適合的整型變數儲存,讀入時可以通過string類讀入。

因此需要通過自定義乙個函式來將string類轉化為bign類。

bign change(string str)

return c;

}

注意,正常情況下string中從0開始是整數形式的高位,為了方便計算轉化時可以倒序讀入,輸出時倒序輸出。

對於兩個bign型別資料的大小比較可以定義乙個比較函式 **compare()**或者過載 **==**符號。

int compare(bign a,bign b)

return 0;//a等於b

}}

bool operator==(bign a,bign b)

return true;

}return false;

}

演算法:

對於兩個整數相加,147+65,

將個位上的數相加,5+7=12;進製1。

將十位上的數相加,4+6=10;再加上個位上的進製10+1=11;進製1。

第二個數沒有百位,但是有進製,1+1=2。

因此可以用大整數型別模擬加法,兩數按相同位相加,保留進製。

bign add(bign a,bign b)

if(carry)

return c;

}

和大整數加法類似,也是模擬整型變數的減法運算。

對於兩個減法:147-65

個位相減,7-5=2。

十位相減,由於4<6,需要向高位借位,4-6+10=8;借位1。

減數沒有百位,但是有借位,1-1=0。

進行減法前先比較大小,保證a>b。

bign sub(bign a,bign b)

return c;

}

低精度就是基本資料型別,如int或long long 。

對於高精度與int 相乘:147$\times$35

7$\times$35=245,個位數取5,進製24。

4$\times$35+24=164,十位取4,進製16。

1$\times$35+16=51,百位取1,進製5。

千位取5。

bign multi(bign a,int b)

while(carry)

return c;

}

對於高精度與低精度除法:1234/7

1<7,商為0,餘數1。

1*10+2=12>7,商為1,餘數5。

5*10+3=53>7,商為7,餘數4。

4*10+4=44>7,商為6,餘數2。

bign divide(bign a,int b,int &c)

else c.b[i] = 0;

}c = carry;

while(c.len - 1 > 0 && c.b[c.len - 1] == 0)

return c;

}

高精度乘高精度:147$\times$35

個位,5$\times$7=35,先存在個位不進製。

十位,5$\times4+3

4+34+

3\times$7=41,先存在十位不進製。

百位,5$\times1+3

1+31+

3\times$4=17,先存在百位不進製。

千位,1$\times$3=3,先存在千位不進製。

bign multi(bign a,bign b)

}for(int i = 0; i < a.len + b.len - 1; i++)

while(carry)

return c;

}

高精度加法,相當於a+b problem,不用考慮負數.

分兩行輸入。a,b

≤1

0500

a,b \leq 10^

a,b≤10

500輸出只有一行,代表a+b的值

輸入 #1複製

1

1

輸出 #1

2
輸入 #2

1001

9099

輸出 #2

10100
**

#include#include#includeusing namespace std;

struct node

};node change(string n)

return c;

}node add(node a,node b)

return 0;

}

求兩數的積。

兩行,兩個整數。

一行乙個整數表示乘積。

輸入 #1複製

1 

2

輸出 #1複製

2
每個數字不超過 1

02000

10^10

2000

,需用高精。

**

#include#include#include#includeusing namespace std;

#define f(i,s,e) for(int i = s; i < e; i++);

typedef long long ll;

struct node

};node change(string n)

return c;

}node multi(node a,node b)

} for(int i = 0; i < a.len + b.len - 1; i++)

while(carry)

return c;

}void print(node a)

return 0;

}

超長整數運算(大整數運算)

問題描述 將形如1234567890123456789不能儲存在long變數中的數稱為超長整數或大整數。現討論大整數的加減乘除運算。思想方法 用陣列儲存超長整數,且為處理的簡單起見約定每個元素存放相同位的數字。如 每個元素存放4位。1 加法運算 void add int a,int b,int c ...

大整數運算

包括大整數的四則運算,一般都是用陣列來模擬大整數的,如果是每一位陣列只存一位數的話,空間浪費比較嚴重,所以這裡每一位陣列儲存4位數,所以是10000進製。加法 輸入 不超過兩百位的非負整數,可能有多餘的前導零。輸出 相加後的結果,不能有多餘的前導零 首先是一些基本的常量定義 define bir 1...

大整數運算

大整數加法 實現 include include intmain c lenc x while c lenc 0 lenc 1 lenc for int i lenc i 1 i printf d c i return0 大整數減法 實現 include include intmain b 205 ...