永发信息网

如何用C++编写大数的乘法

答案:4  悬赏:70  手机版
解决时间 2021-03-26 16:56
如何用C++编写大数的乘法
最佳答案
说明:这是c程序,程序就是算法,这个程序思路非常清晰。就是模拟手动算法,被乘数与乘数的各位分别相乘,然后移位相加。程序已有详细注释。为简化程序,在程序中已设定被乘数和乘数,你可以更改也可以添加输入语句输入。这不是问题。
思考:个人认为为简化计算,应使得被乘数大于乘数,当输入的乘数大于被乘数时,可先将两数调换再相乘。调换也就是个swap()函数之类,我没加进程序里,这个你可以做到,这也不是问题。如程序有不足之处密我。

#include
#include


void calc1(char* str1,int len1,int* tmp,int m);
void accumulate(int cnt,int* res,int res_len,int* tmp,int tmp_len);
char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len);

int main()
{
int i,j;

char str1[]="123456789987";
char str2[]="987456123";
char* result;


int len1=strlen(str1),len2=strlen(str2);
int len=len1+len2;


result=(char*)malloc(len*sizeof(char));
for(i=0;i*(result+i)='0';


printf("The result is: %s",bignum_multi(str1,len1,str2,len2,result,len));
free(result);
system("pause");
return 0;
}


char* bignum_multi(char* str1,int len1,char* str2,int len2,char* result,int len)
{
int i,j,m=0,cnt=0,*tmp,*res;


tmp=(int*)malloc((len1+1)*sizeof(int));
res=(int*)malloc(len*sizeof(int));


for(i=0;itmp[i]=0;
for(j=0;jres[j]=0;

for(i=len2-1;i>=0;i--)
{

m=str2[i]-'0';

calc1(str1,len1,tmp,m);

cnt++;
accumulate(cnt,res,len,tmp,len1+1);
}


i=0;j=0;

while(res[i++]==0);

for(m=i-1;mresult[j]=res[m]+0x30;
result[j]='\0';

free(tmp);
free(res);
return result;
}


void calc1(char* str1,int len1,int* tmp,int m)
{

int i,d=0,remainder=0,carry=0;

for(i=len1-1;i>=0;i--)
{
d=str1[i]-'0';
d*=m;
remainder=(d+carry)%10;
carry=(d+carry)/10;
tmp[i+1]=remainder;
}
if(carry)
tmp[0]=carry;
else
tmp[0]=0;
}

void accumulate(int cnt,int* res,int len,int* tmp,int len1)
{
int m=0,n=0,i,k,remainder=0;
static int carry=0;
for(k=len1-1,i=0;k>=0;k--,i++)
{
m=tmp[k];
n=res[len-cnt-i];
if(m+n+carry>=10)
{
remainder=(m+n+carry)%10;
carry=1;
}
else
{
remainder=m+n+carry;
carry=0;
}
res[len-cnt-i]=remainder;
}
}
全部回答
可以用数组或链表
大数的加法会:用数组模拟加法!
大数的乘法估计也用数组模拟。
与楼主一同等待解答。
用汇编解决大数乘法轻而易举,C++不清楚
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
lefton怎么翻?
狼人是不是狼与人的混种
有一个容量为20的样本,其数据如下(单位:岁
淘宝加推荐搭配需要下架商品吗?
判断题5吨棉花比5吨铁块重.
与吃苦有关的句子有哪些?
长沙金桥国际市场集群有没有地铁?
为什么说唯理论和经验论都是错误的?
各位广大的网友们。社保是怎么一回事
第一位俄罗斯沙皇 全名
弹钢琴前怎样最佳活动手指?
变分法的介绍
拔罐完为什么一直放屁
拉链怎么装
怎么加盟好嫂子刀削面 需要多少钱
推荐资讯
沉默螺旋的民意观与启蒙时代的民意观有何异同
风电轴经喷砂,锌,喷漆后,几何精度会变?
创能电动涡轮增压真的有吹的那么好吗?怎么就
纺织物的NPEO有什么办法去除
急求一组全职高手的cos
请问变压器端子箱和本体端子箱有什么区别?
赤峰松州园小区的学区
这道用1/38×5=1/6 1/25×5=1/5好还是
已知1m等于10的9次方纳米,32m用科学记数法表
性李和性李可以领结婚证吗
单选题欲使0.1mol/LNaHCO3溶液中c(H+)、c(CO3
lny的原函数怎么求
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?