前言
上一篇博客我們分享了高精度加法,減法,這一期我將為大家講解高精度乘法和高精度除法。那讓我們開始吧!
對(duì)加法和減法感興趣的話就點(diǎn)我
1,乘法
讓我們想想我們平時(shí)做數(shù)學(xué)時(shí)遇見乘法是怎么做的。以下圖為例。
高精度乘法也是這樣的一個(gè)思路,首先我們先把a(bǔ)和b的值儲(chǔ)存進(jìn)兩個(gè)數(shù)組之中。然后將兩個(gè)數(shù)組翻轉(zhuǎn)之后,讓a乘以b的每一位(從個(gè)位開始),然后錯(cuò)位相加。最后即可得到結(jié)果。
下面我用代碼的方式來(lái)講解:
#include <stdio.h>
#include<string.h>
void my_reverse(char* arr, int len)//翻轉(zhuǎn)函數(shù)
{
for (int i = 0; i < len - 1; i++, len--)
{
char temp = arr[i];
arr[i] = arr[len - 1];
arr[len - 1] = temp;
}
}
void print_mul(int len1, int len2, char* arr1, char* arr2,int* mul)
{
for (int i = 0; i < len2; i++)
{
for (int j = 0; j < len1; j++)//讓arr1的每一位都乘以arr2的第i位
{//高精度加法
mul[i + j] += (arr1[j]-'0') * (arr2[i]-'0');//將結(jié)果存放在mul中
mul[i + j + 1] += mul[i + j] / 10;
mul[i + j] %= 10;
}
}
while (mul[len1 + len2] == 0&&len1+len2 > 0)//去除前綴多余的0
len1--;
for (int i = len1 + len2; i >= 0; i--)//打印結(jié)果
printf("%d", mul[i]);
}
int main()
{
char arra[10100] = { 0 }, arrb[10100] = { 0 }; int arrmul[10010] = { 0 };//分別儲(chǔ)存a,b的值和a*b的值
scanf("%s %s", arra, arrb);
int lena = strlen(arra);//計(jì)算a和b的長(zhǎng)度
int lenb = strlen(arrb);
my_reverse(arra, lena);//將a和b進(jìn)行翻轉(zhuǎn)方便進(jìn)行運(yùn)算
my_reverse(arrb, lenb);
print_mul(lena, lenb, arra, arrb, arrmul);
return 0;
}
我們學(xué)習(xí)之后可以去洛谷進(jìn)行測(cè)試(洛谷 P1303 A*B Problem)
2,除法
除法在這里,點(diǎn)我點(diǎn)我!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-756297.html
3,尾聲
這樣我們的高精度算法就結(jié)束了,博主還將繼續(xù)更新其他算法和編程學(xué)習(xí)的講解。如果覺得感興趣要記得關(guān)注下博主哦~。如果覺得本篇內(nèi)容講得不錯(cuò)的話請(qǐng)給博主一個(gè)贊和收藏吧。那么我們下期再見!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756297.html
到了這里,關(guān)于高精度加法,減法,乘法,除法(下)(C語(yǔ)言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!