加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

两个大数相乘、精度很高的小数相乘(小数点后位数没有限制,请写

发布时间:2020-12-14 03:56:29 所属栏目:大数据 来源:网络整理
导读:【转】 http://www.cppblog.com/dotaqop/articles/148190.html 算法提示: ????????? 输入 string a,string b; 计算string c=a*b; 返回 c; 1,??? 纪录小数点在a,b中的位置l1,l2, 则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2; 2,??? 去掉a,

【转】http://www.cppblog.com/dotaqop/articles/148190.html

算法提示:

????????? 输入 string a,string b; 计算string c=a*b; 返回 c;

1,??? 纪录小数点在a,b中的位置l1,l2, 则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2;

2,??? 去掉a,b中的小数点,(a,b小数点后移,使a,b变为整数)

3,??? 计算c=a*b; (同整数的大数相乘算法)

4,??? 输出c,(注意在输出倒数第l个数时,输出一个小数点。若是输出的数少于l个,就补0)

du51(郁郁思扬)的答案:


下面是两个大数的相乘的算法:
原理:
大数A:A1A2A3A4...An?转换为n项多项式PolyA
大数B:B1B2B3B4...Bm?转换为m项多项式PolyB
这样将大数乘法转换为多项式PolyA?*?PolyB?,然后将多项式计算结果转换为大数表示。

#?include<stdio.h>
#?include<string.h>
#?include<malloc.h>
?
void? multiply( char *?a, *?b,monospace!important; font-size:1em!important; min-height:inherit!important; color:black!important">*?c)
{
???? int? i,j,ca,cb,*?s;
???? ca= strlen (a);
cb= (b);
s=( int *) malloc ( sizeof ( )*(ca+cb)); // strlen(a)的数a * strlen(b)的数b一定少于strlen(a)+strlen(b)的数

// 初始化数组
???? for ? (i=0;i<ca+cb;i++)
{
???????? s[i]=0;
}
// 各个位上的数分别相乘,并存入相应位的数组成员中(原理类似于小学的两个数相乘的方式)
???? for? (i=0;i<ca;i++)
???????? (j=0;j<cb;j++)
???????????? s[i+j+1]+=(a[i]- '0' )*(b[j]- ); //这里为什么不是s[i+j]?而是s[i+j+1] ------为了统一操作,s[0]是用来存放最高位的进位,否则需要分开进行判断

// 处理有进位的数位
(i=ca+cb-1;i>=0;i--)
{
???????? if ? (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
}

// 清除高位的0
???? i=0;
while? (s[i]==0)
i++;
??????? (j=0;i<ca+cb;i++,j++)
??????????? c[j]=s[i]+ ;
c[j]= ''
???? free (s);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读