1.1 高精度加法 高精度運算的基本運算就是加和減。和算數的加減規則一樣,模擬豎式計算,考慮錯位運算與進製處理。下面是我老師給的**,目前比網上其他的**要精簡和巧妙。
#include #include int main()
, b[202]=;
scanf("%s%s", a, b);
int alen = strlen(a), blen = strlen(b), t = 0, i;
int a1[202]=, b1[202]=;
for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';
for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';
alen = (alen > blen) ? alen : blen;
for (i = 0; i <= alen; i++)
t = a1[i]+b1[i], a1[i] = t%10, a1[i+1] += t/10;
while (!a1[i] && i) i--;
for(; i >= 0; i--) printf("%d", a1[i]);
return 0;
}
1.2高精度加法(壓位)
int型可以存9位數字,而上述**在陣列的每個元素中只存了0-9中的一位數,可以說浪費了很多空間,而且計算機計算4+5和3333+4444用的時間是相同的,所以我們有時候用壓位來節省空間和時間。其原理如下:
以下是我老師給的**:
#include #include #include using namespace std;
const int inf = 1e8;
struct data
void change(string a)
void print()
}a, b;
int main()
2.1 高精度減法
原理和加法一樣,需要不過考慮的不是進製,而是借位。
**如下:
#include #include int main()
, b[202]=;
scanf("%s%s", a, b);
int alen = strlen(a), blen = strlen(b), t = 0, i;
int a1[202]=, b1[202]=;
for (i = 0; i < alen; i++) a1[i] = a[alen-1-i]-'0';
for (i = 0; i < blen; i++) b1[i] = b[blen-1-i]-'0';
alen = (alen > blen) ? alen : blen;
for (i = 0; i <= alen; i++)
t = a1[i]-b1[i], t<0?(t+=10,a1[i+1]--):t, a1[i] = t;
while (!a1[i] && i) i--;
for(; i >= 0; i--) printf("%d", a1[i]);
return 0;
}
2.2 高精度減法(壓位)
減法和加法大同小異,如果你會了加法,那麼減法也不足為懼。以下**是我自己寫的,和我老師寫的有一定差距,如有不足請指出。
#include #include #include using namespace std;
const int inf = 1e8;
struct data
void change(string a)
void print()
}a, b;
int main()
以上的倆個**都只能當且僅當a>=b時才能正常工作,望注意。
3.1 高精度乘法 這個方法出自吳永輝老師。此**簡直讓我拍手叫絕。原理如下:
3 2 1 0
——>陣列a、b的下標
3 4 5 6 i
——>陣列a
* 1 2 7 8 j
——>陣列b
2 7 6 4 8
2 4 1 9 2
6 9 1 2
3 4 5 6
4 4 1 6 7 6 8 ——>陣列c
6 5 4 3 2 1 0 i+j
——>陣列c的下標
以上是倆個四位數相乘的豎式計算方法。可以看出,數的右面對齊,從低位向高位計算,計算結束後將一列結果相加即為答案。那麼把倆個數從右向左依次標記為0、1、2...n,那麼每一列的結果就是第乙個數的
下標為i的數
與第二個數的
下標為j的數
相乘的結果,其存放在第i+j列。最終結果是每一列相加,就是i+j這一列所有數相加。所以可以用c[i+j] += a[i]*b[j]。
for(int i = 0;i < la-1;i++)
for(int j = 0;j < lb-1;j++)
c[i+j] += a[i]*b[j];
for(int i = 0;i < la+lb;i++)
if(c[i] >= 10)
3.2 高精度乘法(壓位) 高精度整數運算
問題描述 編寫乙個程式,進行高精度整數的加 減 乘運算。輸入兩個十進位製大整數m和 n m n最長可達 50位 根據要求計算運算結果並輸出。輸入形式 標準輸入上依次分行輸入以下內容 1.第一行輸入第乙個大整數m。m可能帶有負號,後面是最長可達 50位的數字序列。2.第二行只有乙個字元,可以是 分別代...
經典例題 高精度(大整數)運算
大整數運算 1.藍橋杯 大整數階乘 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n 解決思路 n 非常大,可以使用陣列儲存各位,a 0 表示最低位,初始化為1,然後迴圈,每一位都乘以2 3 n,根據各位大小判斷是否向前進製,最後逆序輸出各位即可 include include us...
高精度 C 中大整數運算
cin a b for i a.size 1 i 0 i for i b.size 1 i 0 i include include using namespace std const int n 1e6 10 10防止出現邊界問題 vector int add vector int a,vector...