本篇文章依然是有关TP2的内容。
TP2主要思想:跳出整型浮点型的限制,定义新的容量比较大的数据类型,从而实现一些大数运算
看了一些网上的算法和代码,也从前辈文章里得到一些灵感,产出一个用C语言实现大数相乘的算法
废话不多说,直接上算法和代码
t_EntierLong multiplication(t_EntierLong n1,t_EntierLong n2)
{
int i,j,m,c;//m是进位变量
t_EntierLong result;
result.Negatif=false;
for(c=0;c<=MAXCHIFFRES;c++)
result.Chiffres[c]=0;
t_EntierLong temperesult;
temperesult.Negatif=false;
for(c=0;c<=MAXCHIFFRES;c++)
temperesult.Chiffres[c]=0;
for(i=0;i<(MAXCHIFFRES/2);i++)//因为相乘位数一共不能大于10,否则溢出
{
for(j=0;j<(MAXCHIFFRES/2);j++)
{
temperesult.Chiffres[j+i]=(n1.Chiffres[i]*n2.Chiffres[j]%10+m);
m=n1.Chiffres[i]*n2.Chiffres[j]/10;
}//里面的for循环得到每一位相乘的结果
result=additionQcq(result,temperesult);
for(c=0;c<=MAXCHIFFRES;c++)
temperesult.Chiffres[c]=0;
}
return result;
}
Idea:假设有两个大数n1n2,用N1的每一位去乘n2,得到的数用temper result记录,因为存在10的几次方的关系,每个temper在记录时需要移位。很巧妙的是这个移位可以用循环变量轻易表示出来。
最后result由temper result累加得来。