当前位置: 首页 > article >正文

高精度加法乘法

高精度加法&乘法都是把数字转化成数组进行运算,存储

高精度加法

建议多在纸上画画,梳理思路

代码实现

  • 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
  • 字符串转逆序数组

int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{
		
	a[n]=s1[i]-'0';//字符转数字
	n++;
}
for(int i=y-1;i>=0;i--)
{
		
	b[m]=s2[i]-'0';
	m++;
}
  • 数组相加

for(int i=0;i<(x>y?x:y);i++)//以最长的数组为基准
	{
		c[i]+=a[i]+b[i];
		if(c[i]>=10)        //注意进位
		{
			c[i+1]+=c[i]/10;
			c[i]=c[i]%10;
		}
	}
  • 逆序输出

if(c[(x>y?x:y)]!=0)           //注意进位输出
{
	cout<<c[(x>y?x:y)];
}
for(int i=(x>y?x:y)-1;i>=0;i--)//逆序输出
{
	cout<<c[i];
}

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串
	int a[250]={0};
	int b[250]={0};
	int c[250]={0};
	string s1,s2;
	getline(cin,s1);
	getline(cin,s2);
//字符串转逆序数组
	int x=s1.size();
	int y=s2.size();
	int n=0;
	int m=0;
	for(int i=x-1;i>=0;i--)
	{
		
		a[n]=s1[i]-'0';
		n++;
	}
	for(int i=y-1;i>=0;i--)
	{
		
		b[m]=s2[i]-'0';
		m++;
	}
//实现加法
	for(int i=0;i<(x>y?x:y);i++)
	{
		c[i]+=a[i]+b[i];
		if(c[i]>=10)
		{
			c[i+1]+=c[i]/10;
			c[i]=c[i]%10;
		}
	}
//输出
	if(c[(x>y?x:y)]!=0)
	{
		cout<<c[(x>y?x:y)];
	}
	for(int i=(x>y?x:y)-1;i>=0;i--)
	{
		cout<<c[i];
	}
	return 0;
}

高精度乘法

代码实现

  • 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
  • 字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{
		
	a[n]=s1[i]-'0';//字符转数字
	n++;
}
for(int i=y-1;i>=0;i--)
{
		
	b[m]=s2[i]-'0';
	m++;
}
  • 循环相乘并相加
for(int i=0;i<x;i++)//两层for循环
{
	for(int j=0;j<y;j++)
	{
		c[j+i]+=a[i]*b[j];
		if(c[j+i]>=10)  //进位
		{
			c[j+i+1]+=c[j+i]/10;
			c[j+i]=c[j+i]%10;
		}
	}
}
  • 逆序输出

可以根据科学计数法相乘规律可知,x位整数乘以y位整数,不大于(x+y)位整数

int p=0;
for(int i=x+y-1;i>=0;i--)//确定位数
{
	if(c[i]!=0)
	{
		p=i;
		break;
	}
}
for(int i=p;i>=0;i--)//逆序输出
{
	cout<<c[i];
}

完整代码

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串
	int a[250]={0};
	int b[250]={0};
	int c[250]={0};
	string s1,s2;
	getline(cin,s1);
	getline(cin,s2);
//字符串转逆序数组
	int x=s1.size();
	int y=s2.size();
	int n=0;
	int m=0;
	for(int i=x-1;i>=0;i--)
	{
		
		a[n]=s1[i]-'0';
		n++;
	}
	for(int i=y-1;i>=0;i--)
	{
		
		b[m]=s2[i]-'0';
		m++;
	}
//乘法运算
	for(int i=0;i<x;i++)
	{
		for(int j=0;j<y;j++)
		{
			c[j+i]+=a[i]*b[j];
			if(c[j+i]>=10)
			{
				c[j+i+1]+=c[j+i]/10;
				c[j+i]=c[j+i]%10;
			}
		}
	}
//逆序输出
	int p=0;
	for(int i=x+y-1;i>=0;i--)
	{
		if(c[i]!=0)
		{
			p=i;
			break;
		}
	}
	for(int i=p;i>=0;i--)
	{
		cout<<c[i];
	}
	return 0;
}

烧脑,啊啊啊啊啊啊啊啊啊啊啊啊啊,窝不想思考,窝没有脑子哇哇哇

小应用

用高精度计算出 S=1!+2!+3!+⋯+n!S=1!+2!+3!+⋯+n!(n≤50n≤50)。

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x)        //乘法
{
	int g=0;
	for(int i=100;i>=0;i--)
	{
		a[i]=a[i]*x+g;
                          //进位
		g=a[i]/10;
		a[i]=a[i]%10;
	}
}
void qh()                //加法
{
	int g=0;
	for(int i=100;i>=0;i--)
	{
		s[i]=s[i]+a[i]+g;
                          //进位
		g=s[i]/10;
		s[i]=s[i]%10;
	}
}
void sc()                //输出
{
	int w;
	for(int i=0;i<=100;i++)
	{
		if(s[i]!=0)
		{
			w=i;
			break;
		}
	}
	for(int i=w;i<=100;i++)
	   printf("%d",s[i]);
}
int main()
{
	scanf("%d",&n);
	s[100]=a[100]=1;
	for(int i=2;i<=n;i++)
	{
		change(i);
		qh();
	}
	sc();
	return 0;
}


http://www.kler.cn/a/526515.html

相关文章:

  • 详解python的修饰符
  • 数科OFD证照生成原理剖析与平替方案实现
  • 大一计算机的自学总结:位运算实现加减乘除
  • 用BGP的路由聚合功能聚合大陆路由,效果显著不?
  • rust如何操作sqlserver
  • 每日 Java 面试题分享【第 17 天】
  • 18、智能驾驶芯片外部接口要求
  • SpringBoot中运行Yolov5程序
  • 前端知识速记—JS篇:null 与 undefined
  • Linux实操篇-文件目录类>/>>/echo/head/tail/ln/history
  • leetcode-分割等和子集
  • Java中 instanceof 的用法(详解)
  • 安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】
  • 谭浩强C语言程序设计(4) 8章(上)
  • deepseek R1 14b显存占用
  • 【Block总结】HWD,小波下采样,适用分类、分割、目标检测等任务|即插即用
  • 【Block总结】CAA捕获远程上下文信息,增强特征提取的能力|即插即用
  • 哈希表实现
  • 缓冲区和c库的简单实现
  • 性能优化2-删除无效引用