大數運算指的是對c語言中那些大到超出表示範圍的數的運算,比如9999999999999999999999999999999+9999999999999999999999999。c語言中無法將這麼大的乙個數儲存到變數中,這裡就要用到大數的運算了。
大數加法:
思路很簡單,就是把這個「大數」以字串的形式存入陣列中,然後倒序放入整型陣列便於逐步相加。附上**如下
void add(char*num1, char*num2)
; int intnum2[max] = ;
int i = 0, j = 0;
int len1 = strlen(num1);
int len2 = strlen(num2);
int len = len1 > len2 ? len1 : len2;
for (i = len1 - 1; i >= 0; i--)//將數字逆序存入整型陣列中,便於相加
j = 0;
i = 0;
for (i = len2 - 1; i >= 0; i--)
for (i = 0; i < len+1; i++)//逐步相加
}for (i = len; i >= 0; i--)
}
大數減法:
減法的思路和加法類似。也是將倆數存入到字元陣列中,然後倒序放入整型陣列便於逐步相減。但區別於加法的一點是減法需要事先判斷好那個數字比較大,由較大數減去較小數。最後輸出的時候要注意正負號,**如下:
void sub(char*num1, char*num2)
; int intnum2[max] = ;
int i = 0, j = 0;
int len1 = strlen(num1);
int len2 = strlen(num2);
int len = len1 > len2 ? len1 : len2;
/*判斷哪個數比較大*/
char*biggersize = judgesize(num1, num2);
for (i = len1 - 1; i >= 0; i--)//倒序存入整型陣列中
j = 0;
i = 0;
for (i = len2 - 1; i >= 0; i--)
if (biggersize==num1)
for (i = 0; i < len; i++)//逐步相減
}else
for (i = 0; i < len; i++)
}if (biggersize==num1)
}else
}}
大數的乘法:
相對於前兩者,乘法稍微複雜一些。乘法的實現主要基於加法:把乙個乘數每位上的數取下來分別與另乙個數相乘(這裡要注意相乘的結果的大小,比如把十位上的數取下來與另一乘數進行運算,要記得在後面補上乙個0),然後把相乘的結果加起來就是結果。
**如下:
void mul(char*num1, char*num2)
; int intnum2[max] = ;
int pt[max] = ;
int num[max] = ;
int i = 0, j = 0, k = 0, t = 0;
int tenpos = 0;//倆個位數相乘的值得十位上的數
int len1 = strlen(num1);
int len2 = strlen(num2);
for (i = len1 - 1; i >= 0; i--)
j = 0;
i = 0;
for (i = len2 - 1; i >= 0; i--)
for (i = 0; i < len2; i++)//取intnum2上的每位來相乘
}/*相乘的結果進行加法運算(大數加法)*/
for (k = 0; k < len1+t+1; k++)
}t++;
memset(pt, 0, sizeof(int)*len1);
}for (i = max - 1; i >= 0;i--)//尋找相乘結果的第一位數
if (num[i] != 0)
for (i = j; i >= 0;i--)
printf("%d", num[i]);
}
大數除法:
思路很簡單,但是實現起來很複雜。這裡通過例子來說明:
假設a=,b=,結果result=:
先取a[0]a[1]即24,減去b一次,得a=,result=;
再取a[1]a[2]即12,發現它小於b,則多取一位,取a[1]a[2]a[3]即123,減b五次,得a=,result=;
再取a[3]a[4]即81,減b三次,得a=,result=。
/*比較除數與被除數上相應位的大小*/
int judgedivisorsize(int*num1, int*num2,int lendivisor,int t)
return
1;//相等的時候返回1
}void div(char*num1, char*num2)
; int intnum2[max] = ;
char result[max] = ;//記錄商的陣列
int i = 0, j = 0, k = 0, t = 0;
int len1 = strlen(num1);
int len2 = strlen(num2);
int lenresult = 0;
if (num2 == judgesize(num1, num2))
for (i = 0; i < len1 ; i++)
for (i = 0; i < len2; i++)
for (i = 0; i <= len1 - len2; i++)
/*當上一輪的首位為0的時候要即使調整,便於正確判斷本輪比較的數的大小*/
if (intnum1[i - 1] == 0)
t = 0;
}result[len2 + i - 1]++;
}/*當一輪比較結束,例如24563/13,24減去13餘下11,不夠減,intnum1首位的1要留到下一輪去比較,設定t為1*/
/*當intnum1首位為0的時候,並不需要留到下一輪*/
for (k = i; k < len2 + i; k++)
}else
}printf("商=");
lenresult = result[len1 - 1] == 0 ? len1 - 1 : len1;
for (i = 0; i < lenresult; i++)
printf("%s\n餘數=", result);
j = 0;
for (i = len1 - len2; i < len1; i++)
}for (i = j; i < len1; i++)
printf("%d", intnum1[i]);
printf("\n");
}
大數的運算
原理在 的注釋裡。include include include intcompare char a,char b 編寫函式比較兩個大數大小。a b返回1,a b返回0,a return0 void add char a,char b,char c 實現兩個大數相加 a1 i 0 i if l 0 ...
大數的基本運算 大數乘法
大數 即超過了計算機定義型別的範圍的數,如126349678984 1321656546446546546546,這種運算的結果 太大,超過了基本型別的範圍,發生溢位,這樣我們就需要運用大數的演算法來解決這個問題了。大數乘法 大數乘法 include include using namespace ...
大數的運算思想
大數計算的因數和結果精度一般是少則數十位,多則幾萬位。在c c 語言中定義的型別中精度最多只有二十多位,因而我們採取用鍊錶存貯的方式來存放大數。在計算中會用到從高位開始計算,和從低位開始計算數值的兩種情況。所以我們將鍊錶定義為雙向鍊錶,其中為乙個單元來存貯資料,乙個指標指向前方的資料,另乙個指向後的...