關於大數(C語言)
大數,即數字位數超乎想象(至少超乎long long想象)的數。因其位數過大,在c語言中不能對其進行直接運算;若想實現運算,則需要一些奇淫小技巧。
大數相加
兩數相加的手算操作:
將兩數右對齊,由右至左對位相加,結果上再加上一位的進位(如果有的話);保留該結果個位為這一位,再將多出的位數(也是如果有的話)進給下一位;反覆進行上述操作,直至兩數均消耗完。
懂的都懂,不懂的我也沒有辦法
模擬手算,即可實現大數相加
下面放程式碼
#include <stdio.h>
int main()
{
char a[500], b[500];
scanf("%s %s",a,b);//輸入
int da = 0, db = 0;//用於錄每個數字的長度
//將ascii碼轉換成數字
int tmpa[500] = {0};
for(int i = 0; a[i] != 0; i++)
{
tmpa[i+1] = a[i] - '0';
da++;
}
for(int i = 1; i <= da; i++)
{
a[i] = tmpa[i];
}
int tmpb[500] = {0};
for(int i = 0; b[i] != 0; i++)
{
tmpb[i+1] = b[i] - '0';
db++;
}
for(int i = 1; i <= db; i++)
{
b[i] = tmpb[i];
}
//右對齊處理
int d;//有效運算長度
if(da > db)
{
d = da;
int tmp[500] = {0};
for(int i = d; i >= db - 1; i--)
{
tmp[i] = b[i - (da - db)];
}
for(int i = 1; i <= d; i++)
{
b[i] = tmp[i];
}
}
if(db > da)
{
d = db;
int tmp[500] = {0};
for(int i = d; i >= da - 1; i--)
{
tmp[i] = a[i-(db-da)];
}
for(int i = 1; i <= d; i++)
{
a[i] = tmp[i];
}
}
if(da == db) d = da;
//模擬手算加法
char c[510] = {0}, add = 0;
for(int i = d; i > 0; i--)
{
int tmp = a[i] + b[i];
c[i] = tmp % 10 + add;
add = tmp / 10;
}
//輸出
if(add != 0) printf("%d",add);
for(int i = 1; i <= d; i++)
{
printf("%d",c[i]);
}
}
大數相乘
學廢了大數相加,大數相乘不是so easy?即像手算乘法一樣,將第一個數的每一位與第二個數相乘,得到的一堆數進行合理的錯位相加,再處理一下進位即可。如圖:
為了簡化程式碼,我們也可以將兩個數的各位相乘,根據結果的位權進行錯位相加,再稍稍處理一下進位即可。如圖:
程式碼實現:
#include <stdio.h>
#include <string.h>
int main()
{
char a1[10001], b1[10001];
int a[10001], b[10001], x, len, c[10001];
//輸入
gets(a1);
gets(b1);
int lena = strlen(a1);
int lenb = strlen(b1);
//將ascii碼轉換成數字
for(int i = 1; i <= lena; i++)
{
a[i] = a1[lena-i] - '0';
}
for(int i = 1; i <= lenb; i++)
{
b[i] = b1[lenb-i]-'0';
}
//模擬手算乘法
for(int i = 1; i <= lenb; i++)
{
for(int j = 1; j <= lena; j++)
{
c[i+j-1]+=a[j]*b[i];
}
}
//結果處理
for(int i = 1; i < lena + lenb; i++)
{
if(c[i] > 9)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
//判斷結果位數
len = lena + lenb;
while(c[len]==0 && len>1)
{
len--;
}
//輸出
for(int i = len; i >= 1; i--)
{
printf("%d",c[i]);
}
}
相關文章
- 關於數位顛倒--C語言描述C語言
- 關於C語言的常量C語言
- 關於C語言的位運算子C語言
- 關於C語言的面試問題C語言面試
- 關於c語言模擬c++的多型C語言C++多型
- 關於C語言的簡單介紹C語言
- 關於C語言書的書名徵集C語言
- C語言關於檔案操作的命令C語言
- C語言關於多原始檔的呼叫C語言
- 關於c語言單項鍊表尾新增C語言
- 關於c語言輸入字串的總結C語言字串
- 有幾點關於C語言的疑問C語言
- C語言關於標頭檔案的使用C語言
- C語言大總結C語言
- c語言關於陣列的簡單運算C語言陣列
- 關於C語言的圖形程式設計薦C語言程式設計
- 在 ISO C90 標準中 C 語言負數比正數大?
- 關於語言的思考
- 關於函數語言程式設計的思考(1)函數程式設計
- 關於函數語言程式設計的思考(2)函數程式設計
- 一個關於pynoi遊戲的C語言程式設計遊戲C語言程式設計
- 猜數遊戲--C語言描述遊戲C語言
- 關於C語言Switch語句,先學這些技巧夠不夠?C語言
- 關於大語言模型時代下自學的一點想法模型
- C語言 不大於2019的最大反數、迴文數C語言
- C語言關於回撥函式和this指標探討C語言函式指標
- c語言檔案操作相關C語言
- C語言輸出多位小數C語言
- C語言sizeof()變數、字元、字串C語言變數字元字串
- C語言:迴文數計算C語言
- C語言萌新上手:數列分段C語言
- 1354: 素數判定(C語言)C語言
- c語言 構造素數表C語言
- c語言字串,數字轉換C語言字串
- 關於Ruby的語言特點
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- Linux下關於時間概念的C語言程式設計LinuxC語言程式設計