所謂大數,就是數字非常(*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 如果是運算子,先跟棧頂的運算子比,只要不...