高精度乘法(詳細(xì)解答)
/*
目前信息技術(shù)鄰域啊高進(jìn)度運(yùn)算越來(lái)越普遍,但是又非常難啊。
現(xiàn)在up來(lái)溫習(xí)一下高進(jìn)度運(yùn)算,試一試蛤,順便來(lái)幫助大家理解一下
up打字辛苦給給一個(gè)免費(fèi)的贊吧,求你們了,謝謝!
話(huà)不多說(shuō),直接開(kāi)始?
*/?

//注意,高精度乘法無(wú)法適用于負(fù)數(shù)相乘?
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=209;
char x[maxn],y[maxn];
int a[maxn],b[maxn],c[2*maxn];
int main()
{
cin>>x>>y;//輸入想要運(yùn)算的兩個(gè)數(shù)?
int len1=strlen(x),len2=strlen(y);//分別記錄x,y的長(zhǎng)度到len1與len2?
//初始化a,b,c的值?
memset(a,0,sizeof a);?
memset(b,0,sizeof b);
memset(c,0,sizeof c);
? ? //把x,y數(shù)組中的每一位的數(shù)字在0~9之間的序號(hào)記錄到 a,b數(shù)組(即把每一個(gè)數(shù)字記錄到a,b數(shù)字里)?
//比如:7在ASCII碼中是55,0在ASCII碼中是48,所以7的序號(hào)應(yīng)該是55-48=7,再把7記錄到a,b數(shù)組。?
? ? for(int i=len1-1,j=0; i>=0; i--,j++) a[j]=x[i]-'0';
? ? for(int i=len2-1,j=0; i>=0; i--,j++) b[j]=y[i]-'0';
? ? //各個(gè)位于各個(gè)位相乘(核心)?
? ? //注意!這里的每一個(gè)位數(shù)可能大于10,所以我們還有下面的程序管理進(jìn)位?
? ? for(int i=0; i<len1; i++)? ? ? ? ? ? ? //a數(shù)組的每一個(gè)數(shù)字循環(huán)一遍?
? ? for(int j=0; j<len2; j++)? ? ? ? ? ??? //b數(shù)組的每一個(gè)數(shù)字循環(huán)一遍?
? ? ? ? ? ? c[i+j]+=a[i]*b[j];? ? ? ? ? ? ??? ?//相乘結(jié)果記錄到c數(shù)組里?
? ? int i;
? ? for(i=0; i<2*maxn; i++)? ? ? ? ? ? ? ? //循環(huán)2*maxn遍,把每一個(gè)位數(shù)都循環(huán)一遍?
? ? {
? ? ? ? c[i+1]+=c[i]/10;//前面那個(gè)位需要加后面那一位的進(jìn)位數(shù),如:3(23)轉(zhuǎn)化成(3+1)(23%10)=42?
? ? ? ? c[i]%=10;//后面那個(gè)數(shù)是原先的取余10,同上面的例子?
? ? }
? ? //輸出答案?
? ? int k=2*maxn;//一共的位數(shù)?
? ? while(c[k]==0) k--;//把每一個(gè)位數(shù)都循環(huán)一遍,保證沒(méi)有遺漏?
? ? if(k<0) cout<<"0";//如果運(yùn)算2個(gè)數(shù)是0*0,那么k會(huì)直接變成負(fù)數(shù),導(dǎo)致無(wú)法輸出,有了這個(gè)就會(huì)讓程序輸出0了。?
? ? else? ??
? ? for(i=k;i>=0; i--)//輸出每一位的位數(shù)?
? ? ? ? cout<<c[i];
? ? return 0;
}
/*
總結(jié):
輸入字符通過(guò)-'0'將其轉(zhuǎn)化成數(shù)字并存儲(chǔ)到其他的數(shù)組里再用循環(huán)把他們挨個(gè)相乘
注意:這里的乘是乘數(shù)的各個(gè)位乘乘數(shù)的各個(gè)位
如果有進(jìn)位的話(huà),那么把進(jìn)位的數(shù)存儲(chǔ)給前面的結(jié)果,這里就是c[i+1]+=c[i]/10,存完以后當(dāng)前位數(shù)就變成了c[i]%=10;
保存完以后就循環(huán)輸出答案就好了?
*/?