栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 高精度乘法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 高精度乘法

乘法的思路和加减法的有亿点点不同

第一,要知道两个长度为x和y的数乘了之后的最大以及最小的长度是多少。

第二,知道对于某一个数字来说,它是怎么得到的。

1*1=1,11*1=11,111*11=1221,得出:最小的长度是x+y-1。

9*9=81,99*99=9801,得出:最大的长度是x+y.

 111

* 11

___

111

 111

___

1221

得出:第一个数的第x位乘以第二个数的第y位,得出的结果要放在第x+y-1位。

#include
using namespace std;
const int N=10007;
char s[N];
struct node{
	int num[N],len;
	void init(){
		memset(num,0,sizeof(num));
		len=1;
	}
	void read(){
		scanf("%s",s+1);
		len=strlen(s+1);
		for(int i=1;i<=len;i++)
			num[len-i+1]=s[i]-'0';
	}
	void write(){
		for(int i=len;i>0;i--)
			printf("%d",num[i]);
		printf("n");
	}
}s1,s2,ans;
node operator*(node a,node b){
	node c;
	c.init();
	c.len=a.len+b.len-1;
	for(int i=1;i<=a.len;i++){
		for(int j=1;j<=b.len;j++){
			c.num[i+j-1]+=a.num[i]*b.num[j];
			if(c.num[i+j-1]>=10){
				c.num[i+j]+=c.num[i+j-1]/10;
				c.num[i+j-1]%=10;
			}
		}
	}
	while(c.num[c.len+1]!=0) c.len++;
	return c;
}
int main(){
	s1.read();
	s2.read();
	ans=s1*s2;
	ans.write();
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347921.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号