大整數運算

2021-09-27 04:07:50 字數 1954 閱讀 8138

q:大整數的儲存結構體該如何定義?

a:

struct bign 

}

注意:整數的高位儲存在陣列的高位,整數的低位儲存在陣列的低位。

如:23813儲存為d[0]=3, d[1]=1, d[2]=8。。。

q:如何把(數字)字串讀入成為大整數的結構體儲存?

即實現函式bign change(char str)

大整數結構體為:

struct bign 

}

a:

// 把整數轉換為bign

bign change(char str)

}

q:如何比較兩個大整數變數的大小?

大整數結構體為:

struct bign 

}

a:

比較規則:先判斷兩者的len大小,如果不相等,則以長的為大;如果相等,則從高位到低位進行比較,知道出現某一位不等,就可以判斷兩個數的大小。

// 比較a和b大小,a大、相等、a小分別返回1、0、-1

int compare(bign a, bign b)

return 0; // 兩數相等

}}

q:高精度加法的原理步驟?

將該位上的兩個數字和進製相加,得到的結果取個位數作為該位結果,取十位數作為新的進製。

q:高精度的加法實現的**?

// 高精度a+b

bign add(bign a, bign b)

// 如果最後進製不為0,則直接賦給結果的最高位

if (carry != 0)

return c;

}

q:高精度減法的原理步驟?

對某一步,比較被減位和減位,如果不夠減,則令被減位的高位減1、被減位加10再進行減法;如果夠減,則直接減。最後一步要注意減法後高位可能有多餘的0,要忽視它們,但也要保證結果至少有一位數。

q:高精度減法的實現**?

// 高精度a-b

bign sub(bign a, bign b)

// 減法結果為當前位結果

c.d[c.len++] = a.d[i] - b.d[i];

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

return c;

}

使用sub函式前要比較兩個數的大小,如果被減數小於減數,需要交換兩個變數,然後輸出負號,再使用sub函式。

q:高精度與低精度的乘法的步驟原理?

取bign的某位與int型整體相乘,再與進製相加,所得結果的個位數作為該位結果,高位部分作為新的進製。

q:高精度與低精度的乘法的實現**?

// 高精度乘法

bign multi(bign a, int b)

// 和加法不一樣,乘法的進製可能不止一位,因此用while

while (carry != 0)

return c;

}

q:高精度與低精度的除法的步驟原理?

上一步的餘數乘以10加上該步的位,得到該步臨時的被除數,將其與被除數比較:

如果不夠除,則該位的商為0;

如果夠除,則商即為對應的商,餘數即為對應的餘數。

最後一步要注意減法後高位可能有多餘的0,要忽視它們,但也要保證結果至少有一位數。

q:高精度與低精度的除法的實現**?

// 高精度除法,r為餘數

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

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

return c;

}

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

問題描述 將形如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 ...