大整數運算

2022-02-27 05:45:55 字數 1599 閱讀 1381

為了方便隨時獲取大整數的長度,一般都會定義乙個int型變數len來記錄其長度,並和d陣列組成結構體。

struct bign

};

在輸入大整數時,一般都是先用字串進行讀入,然後再把字串另存為到bign結構體,由於按照字串的順序進行讀入時,整數的高位就會變成陣列的低位,所以要將字串倒著賦給d陣列。

bign change(char str)

return a;

}

輸出bign

void print(bign a)

}

規則:先判斷兩者的len大小,如果不相等,則以長的為大;如果相等,則從高位到低位進行比較,直到出現某一位不等,只要有一位a大,則a大,只要有一位a小,則a小。

int compare(bign a, bign b)

return 0;

}}

思路:與整數相加的方法一樣,將改為上的兩個數字與進製相加,得到的結果取個位數作為該位結果,取十位數作為新的進製。

bign add(bign a, bign b)

if (ci != 0)

return c;

}

\(\color\)

\(\color\)

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

bign sub(bign a, bign b)

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

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

return c;

}

\(\color\)

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

bign multi(bign a, int b)

while (ci != 0)

return c;

}

\(\color\)

思路:對於某一步來說,上一步的餘數乘以10加上該步的位,得到該步臨時的被除數,將其與除數比較:如果不夠除,則該位的商為0;如果夠除,則商即為對應的商,餘數即為對應的餘數。最後一步要注意減法後高位可能有多餘的0,要去除它們,但也要保證結果至少有一位數。

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

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

return c;

}

在上述**中,考慮到函式每次只能返回乙個資料,而很多題目裡面會經常要求得到餘數,因此把餘數寫成「引用」的形式直接作為引數傳入,或是把r設成全域性變數。其作用是在函式中可以視為直接對原變數進行修改,而不像普通函式引數那樣,在函式中的修改不影響原變數的值。這樣當函式結束時,r的值就是最終的餘數。

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

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