如何用C++编写大数的乘法
答案:4 悬赏:70 手机版
解决时间 2021-03-26 16:56
- 提问者网友:那叫心脏的地方装的都是你
- 2021-03-26 01:28
如何用C++编写大数的乘法
最佳答案
- 五星知识达人网友:摆渡翁
- 2021-03-26 01:37
说明:这是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;i tmp[i]=0;
for(j=0;j res[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;m result[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;
}
}
思考:个人认为为简化计算,应使得被乘数大于乘数,当输入的乘数大于被乘数时,可先将两数调换再相乘。调换也就是个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
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;i
for(j=0;j
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;m
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;
}
}
全部回答
- 1楼网友:雪起风沙痕
- 2021-03-26 05:21
可以用数组或链表
- 2楼网友:慢性怪人
- 2021-03-26 03:44
大数的加法会:用数组模拟加法!
大数的乘法估计也用数组模拟。
大数的乘法估计也用数组模拟。
- 3楼网友:十年萤火照君眠
- 2021-03-26 02:57
与楼主一同等待解答。
用汇编解决大数乘法轻而易举,C++不清楚
用汇编解决大数乘法轻而易举,C++不清楚
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯