C語言 C 實現大數四則運算

2021-10-05 12:30:17 字數 3982 閱讀 5851

所謂大數,就是數字非常(*100)的大,不管是int還是long long int都儲存不下的數,如何進行加減乘除四則運算,這種情況在計算機的運算中還是很常見的,現將大致思路寫上,並附上**以供參考。

首先資料必然是不能以int或者long long int儲存,那麼只能以字串或者字元陣列的形式儲存。而且實際上,以字元陣列接收資料最佳,然後把字元陣列轉化為int陣列,再對數字進行計算。

其次,聯想起我們小學二年級所學的加減乘除四則運算,我們會發現乙個最基本的規律:

這就提示我們,資料需要進行一下處理,因為輸入的資料是不定長的,所以我們需要把資料對齊。也就是說我們需要在加減乘,將資料倒過來,個位對個位,十分位對十分位;但是在除法中,我們只要按從左往右接收資料就可。

int陣列沒有不能像字元陣列那樣,可以直接獲取長度,所以最初想法就是在轉化int陣列的時候,再加上乙個變數len,標記陣列長度。

#define max 1000

struct bignum

};

根據上邊的思路,我們需要將char型陣列轉化為int型陣列,而且是倒序,這樣保證從個位開始對齊,方便加減乘運算,而除法只需要將char型陣列轉化為int型陣列就可。

當然還有一些其他的工具,比如比較兩個bignum的大小,這在減法和除法上需要用到,還有除法採用的是減法思想,所以除法的陣列順序也要有個調整。

// 加減乘處理使用

bignum transfer

(char str)

// 除法處理使用

bignum transfersort

(char str)

// 加減乘處理使用

intcompare

(bignum a, bignum b)}}

// 除法處理使用

intcomparesort

(bignum a, bignum b)}}

// 倒序,除法用

void

reverse

(int a,

int len)

}

bignum add

(bignum a, bignum b)

// 處理進製情況

if(flag !=0)

c.n[c.len++]=

1;return c;

}

bignum sub

(bignum a, bignum b)

c.n[c.len++

]= a.n[i]

- b.n[i];}

// 去除高位0 112-111=001,但是要保證有一位數

while

(c.n[c.len-1]

==0&& c.len>1)

c.len--

;return c;

}

// 高精度與低精度乘法運算,為高精度乘法運算使用

bignum sigmul

(bignum a,

int b)

while

(flag)

return c;

}// 陣列移位操作

bignum move

(bignum a,

int index)

return b;

}// 高精度乘法運算

bignum mul

(bignum a, bignum b)

return c;

}

其實可以用逆序,但是當前正序思維好捋一點。減法暫時實現了除數是個位數,多位的還沒來得及除錯,但是考完試不太想debug,先放個坑在這裡,啥時候記得補了,再回來填。歡迎大佬進行指導。

// 高精度與低精度除法運算  逆序

bignum sigdiv

(bignum a,

int b,

int&r)

}while

(c.n[c.len-1]

==0&& c.len>1)

c.len--

;return c;

}// 高精度除法運算

bignum div

(bignum a, bignum b, bignum r)

else

c.n[i]

= index;}}

// 處理開頭 b.n-1 個0 ,迴圈左移

while

(c.n[0]

==0&& c.len>1)

return c;

}

#include

#include

#include

#include

using

namespace std;

#define max 1000

struct bignum};

void

screenprint

(bignum a)

void

print

(bignum a)

bignum transfer

(char str)

bignum transfersort

(char str)

void

reverse

(int a,

int len)

}bignum add

(bignum a, bignum b)

if(flag !=0)

c.n[c.len++]=

1;return c;

}bignum sub

(bignum a, bignum b)

c.n[c.len++

]= a.n[i]

- b.n[i];}

// 去除高位0 112-111=001,但是要保證有一位數

while

(c.n[c.len-1]

==0&& c.len>1)

c.len--

;return c;

}int

compare

(bignum a, bignum b)}}

intcomparesort

(bignum a, bignum b)}}

bignum sigmul

(bignum a,

int b)

while

(flag)

return c;

}bignum move

(bignum a,

int index)

return b;

}bignum mul

(bignum a, bignum b)

return c;

}bignum sigdiv

(bignum a,

int b,

int&r)

}while

(c.n[c.len-1]

==0&& c.len>1)

c.len--

;return c;

}bignum div

(bignum a, bignum b, bignum r)

else

c.n[i]

= index;}}

while

(c.n[0]

==0&& c.len>1)

return c;

}int

main()

else if(compare(bn_str1, bn_str2) == -1)

elseif(

comparesort

(bn_str1, bn_str2)==-

1)printf

("0");

// aelse

printf

("1");

// a=b

return0;

}

不太想碼字了,剛考完密碼學第一次考試,人生啊,就是如此艱難。溜了溜了,睡覺。

C語言實現大數四則運算

眾所周知,c語言中int型別是有限制,不能進行超過其範圍的運算,而如果採用float型別進行運算,由於float在記憶體中特殊的儲存形式,又失去了計算的進度。要解決整個問題,一種解決方法是通過字串陣列實現資料的儲存,然後實現它們之間四則運算的函式。為了實現字元陣列之間的運算,要考慮數值的正負性,數字...

四則運算(c語言)

這個作業屬於哪個課程 這個作業要求在 homework 11376 作業目標 寫乙個能自動生成小學四則運算題目的程式 學號 3190704109 源 int right 0 int wrong 0 void add else void minu else void mul else void di ...

C 實現四則運算

表示式計算思路 1 準備兩個棧,乙個資料棧,乙個運算子棧。反覆讀取表示式 2 3 4 2 如果是數,入數棧。3 如果是左括號,入運算子棧。如果是右括號,反覆從運算子棧頂取運算符合從資料棧中取兩個資料進行計算,並把運算結果入資料棧,直到遇到棧頂或左括號為止。4 如果是運算子,先跟棧頂的運算子比,只要不...