關於大數(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語言 不大於2019的最大反數、迴文數C語言
- c語言關於陣列的簡單運算C語言陣列
- 在 ISO C90 標準中 C 語言負數比正數大?
- 關於C語言Switch語句,先學這些技巧夠不夠?C語言
- 1354: 素數判定(C語言)C語言
- C語言輸出多位小數C語言
- c語言 構造素數表C語言
- C語言sizeof()變數、字元、字串C語言變數字元字串
- C語言:迴文數計算C語言
- 關於Ruby的語言特點
- 關於大語言模型時代下自學的一點想法模型
- c語言static關鍵字的理解C語言
- C語言的幾個關鍵字C語言
- C語言有關函式淺析C語言函式
- C語言C語言
- 15. 三數之和_(c語言版)C語言
- C語言萌新上手:數列分段C語言
- 判斷水仙花數C語言C語言
- C語言可變引數詳解C語言
- C語言關於指標,gets()和gets_s()函式的理解C語言指標函式
- 【C語言】調整陣列使奇數全部都位於偶數前面。C語言陣列
- 聊聊C語言/C++—程式和程式語言C語言C++
- Go 語言關於 Type Assertions 的 坑Go
- 細數 C++ 那些比起 C語言 更爽的特性C++C語言
- 大資料與程式語言關係大資料
- 關於10進位制轉2進位制的C語言程式碼C語言
- C語言-變數常量資料型別C語言變數資料型別
- C語言萌新上手:相鄰數對C語言
- C語言--靜態區域性變數C語言變數
- C語言求200000以內的自守數C語言
- 偽隨機數C語言程式設計隨機C語言程式設計
- 7-1 素數對猜想(C語言)C語言