看數(shù)據(jù)結(jié)構(gòu),鏈表的應(yīng)用,講到他可以處理多項(xiàng)式的乘法。
實(shí)際上也可以拿相似的思想做大數(shù)相乘,只是把輸入源從鏈表變?yōu)閿?shù)組即可。
基本原理:
1,把兩個(gè)數(shù)字a和b轉(zhuǎn)換成字符,放到字符數(shù)組里;或者把數(shù)字的每一位隔離開(kāi)分別放到數(shù)組里作為一位,這樣更方便乘法處理。這樣做的根本好處是:相乘的時(shí)候不會(huì)造成溢出。
2,結(jié)果數(shù)組的長(zhǎng)度,應(yīng)該是a的長(zhǎng)度+b的長(zhǎng)度+1,所以定義一個(gè)這樣的數(shù)組;
3,過(guò)程很簡(jiǎn)單了:a中的第i位乘以b中的第j位,保存在c中的第i+j位;
4,后期處理。注意,經(jīng)過(guò)第三步處理過(guò)的c中的結(jié)果,每一位都可能向高位進(jìn)位;比如說(shuō),c[8]=24。這時(shí)候就要從低位開(kāi)始把進(jìn)位部分向高位加,一次循環(huán)即可:
for(i=0;i for(j=0;j *(c+i+j)+=*(a+i) * *(b+j);
// 處理進(jìn)位
for(i=0;i {
*(c+i+1)+=*(c+i)/10; //進(jìn)位累加到高位
*(c+i)=*(c+i)%10; //該位的最后結(jié)果
}
這時(shí)候就計(jì)算完畢了。
但是,第3行和第8、9行實(shí)際上是可以放到一起的??荚嚧筇崾局灰我庖淮斡?jì)算導(dǎo)致了c[k]的值>10,那么立刻進(jìn)行進(jìn)位處理。于是提高之后的版本是:
for(i=0;i for(j=0;j {
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
關(guān)于進(jìn)位這個(gè)事情,多項(xiàng)式就沒(méi)有這個(gè)問(wèn)題,因?yàn)槊恳豁?xiàng)的系數(shù)可以>10。不過(guò)他也有他自己的處理:如果系數(shù)為0的話(huà),就把該項(xiàng)刪除
實(shí)際上也可以拿相似的思想做大數(shù)相乘,只是把輸入源從鏈表變?yōu)閿?shù)組即可。
基本原理:
1,把兩個(gè)數(shù)字a和b轉(zhuǎn)換成字符,放到字符數(shù)組里;或者把數(shù)字的每一位隔離開(kāi)分別放到數(shù)組里作為一位,這樣更方便乘法處理。這樣做的根本好處是:相乘的時(shí)候不會(huì)造成溢出。
2,結(jié)果數(shù)組的長(zhǎng)度,應(yīng)該是a的長(zhǎng)度+b的長(zhǎng)度+1,所以定義一個(gè)這樣的數(shù)組;
3,過(guò)程很簡(jiǎn)單了:a中的第i位乘以b中的第j位,保存在c中的第i+j位;
4,后期處理。注意,經(jīng)過(guò)第三步處理過(guò)的c中的結(jié)果,每一位都可能向高位進(jìn)位;比如說(shuō),c[8]=24。這時(shí)候就要從低位開(kāi)始把進(jìn)位部分向高位加,一次循環(huán)即可:
for(i=0;i
// 處理進(jìn)位
for(i=0;i
*(c+i+1)+=*(c+i)/10; //進(jìn)位累加到高位
*(c+i)=*(c+i)%10; //該位的最后結(jié)果
}
這時(shí)候就計(jì)算完畢了。
但是,第3行和第8、9行實(shí)際上是可以放到一起的??荚嚧筇崾局灰我庖淮斡?jì)算導(dǎo)致了c[k]的值>10,那么立刻進(jìn)行進(jìn)位處理。于是提高之后的版本是:
for(i=0;i
c[i+j]+=a[i]*b[j];
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
關(guān)于進(jìn)位這個(gè)事情,多項(xiàng)式就沒(méi)有這個(gè)問(wèn)題,因?yàn)槊恳豁?xiàng)的系數(shù)可以>10。不過(guò)他也有他自己的處理:如果系數(shù)為0的話(huà),就把該項(xiàng)刪除