C++知识点总结(6):高精度乘法

一、高精度数 × 低精度数

1. 输入两个数字

char a_str[1005] = {};
long long b;
cin >> a_str >> b;

2. 将高精度数转换为整型

int a[1005] = {};
int len_a = strlen(a_str);
for (int i = 0; i <= len_a-1; i++)
{
    a[len_a-i-1] = a_str[i] - 48;
}

3. 计算

int len_ans = len_a;
long long ans[1005] = {};
long long in = 0;
for (int i = 0; i <= len_ans-1; i++)
{
    ans[i] = a[i] * b + in; // 存储数字 
    in = ans[i] / 10; // 得到进位 
    ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位 
}

4. 输出结果

while (in > 0) // 最高位处理 
{
    ans[len_ans] = in % 10;
    len_ans++;
    in /= 10;
}

// 正常输出 
for (int i = len_ans - 1; i >= 0; i--)
{
    cout << ans[i]; 
}

5. 注意一个特例先行

if (a == 0 || b == 0)
{
    cout << 0;
    return 0;
} 

6. 完整代码

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    // 存储并输出两个数字 
	char a_str[1005] = {};
	long long b;
	cin >> a_str >> b;
	
	// 特例先行:结果是0的情况
	if (a == 0 || b == 0)
	{
		cout << 0;
		return 0;
	} 
	
	// 转换第一个高精度数 
	int a[1005] = {};
	int len_a = strlen(a_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[len_a-i-1] = a_str[i] - 48;
	}
	
	// 计算
	int len_ans = len_a;
	long long ans[1005] = {};
	long long in = 0;
	for (int i = 0; i <= len_ans-1; i++)
	{
		ans[i] = a[i] * b + in; // 存储数字 
		in = ans[i] / 10; // 得到进位 
		ans[i] %= 10; // 在对应的数位上保留实际得数的最后一位 
	}
	
	// 输出结果 
	while (in > 0) // 最高位处理 
	{
		ans[len_ans] = in % 10;
		len_ans++;
		in /= 10;
	}

	// 正常输出 
	for (int i = len_ans - 1; i >= 0; i--)
	{
		cout << ans[i]; 
	}
	
	return 0;
}
/*
注明:
由于是从编译器中复制过来的,所以缩进有些难看,大家可以自行调整(复制到本地编译器还是可以的)。
*/

二、高精度数 × 高精度数

        计算思路改变了一些,其他不变。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 存储并输出两个数字 
	char a_str[1005] = {};
	char b_str[1005] = {};
	cin >> a_str >> b_str;
	
	// 转换高精度数 
	int a[1005] = {};
	int b[1005] = {};
	int len_a = strlen(a_str);
	int len_b = strlen(b_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[len_a-i-1] = a_str[i] - 48;
	}
	for (int i = 0; i <= len_b-1; i++)
	{
		b[len_b-i-1] = b_str[i] - 48;
	}
	
	// 计算
	int ans[2010] = {};
	int in = 0;
	for (int j = 0; j <= len_b-1; j++)
	{
		for (int i = 0; i <= len_a-1; i++)
		{
			ans[i+j] = a[i] * b[j] + in + ans[i+j];
			in = ans[i+j] / 10;
			ans[i+j] %= 10; 
		} 
		// 最高位处理 
		ans[len_a+j] = in;
		in = 0; // 重置进位
	}
	
	// 正常输出
	int len_ans = len_a + len_b; // 结果的最大位数
	// 前导0
        while (ans[len_ans-1] == 0 && len_ans > 1)
        {
                len_ans--;
        }
	
        for (int i = len_ans - 1; i >= 0; i--)
        {
                cout << ans[i]; 
        }
	
        return 0;
}

三、高精度平方计算器

        首先我们要知道,n的平方(记作n²)相当于n ×n,其实我们可以按照高精度数 × 高精度数的思想来完成。

  •  想法1:将所有b都改为a。
  •  想法2:使用strcpy()函数直接将a的值赋值给b。

        建议采用想法2,示例代码如下:

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 存储并输出两个数字 
	char a_str[1005] = {};
	char b_str[1005] = {};
	cin >> a_str;
	strcpy(b_str, a_str);
	
	// 转换高精度数 
	int a[1005] = {};
	int b[1005] = {};
	int len_a = strlen(a_str);
	int len_b = strlen(b_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[len_a-i-1] = a_str[i] - 48;
	}
	for (int i = 0; i <= len_b-1; i++)
	{
		b[len_b-i-1] = b_str[i] - 48;
	}
	
	// 计算
	int ans[2010] = {};
	int in = 0;
	for (int j = 0; j <= len_b-1; j++)
	{
		for (int i = 0; i <= len_a-1; i++)
		{
			ans[i+j] = a[i] * b[j] + in + ans[i+j];
			in = ans[i+j] / 10;
			ans[i+j] %= 10; 
		} 
		// 最高位处理 
		ans[len_a+j] = in;
		in = 0; // 重置进位
	}
	
	// 正常输出
	int len_ans = len_a + len_b; // 结果的最大位数
	// 前导0
    while (ans[len_ans-1] == 0 && len_ans > 1)
    {
        len_ans--;
    }
	
    for (int i = len_ans - 1; i >= 0; i--)
    {
        cout << ans[i]; 
    }
    
    return 0;
}

四、高精度阶乘计算器

        注释已经详细地注明了,大家自己看一看即可。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 输入
	int n;
	cin >> n;
	
	// 初始化计算相关变量 
	int in = 0;
	int ans[10005] = {1};
	int len_ans = 1;
	
	// 计算阶乘
	for (int num = 1; num < n; num++) // num是对应的因数(即3! = 1 * 2 * 3中的1、2、3)
	{
		// 高精度数 ×低精度数代码 
		for (int i = 0; i <= len_ans-1; i++) 
		{
			ans[i] = ans[i] * num + in; // ans[i] = 上一轮的结果 * 下一个因数 + 上一次的进位 
			in = ans[i] / 10;
			ans[i] %= 10;
		}
		while (in)
		{
			ans[len_ans] = in % 10;
			len_ans++;
			in /= 10;
		}
	}
	for (int i = 1; i <= len_ans; i++)
	{
		cout << ans[i];
	}
	return 0;
} 

今日收获

        这样,高精度就只剩下下周要研究的高精度除法啦( ̄︶ ̄)加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/162705.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.3 调用智谱 API

调用智谱 API 1 申请调用权限2 调用智谱 AI API3 使用 LangChain 调用智谱 AI参考&#xff1a; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B&#xff0c;并构建了…

【Python】Loguru模块更简洁的日志记录库

Loguru: 更优雅的日志记录解决方案&#xff01; loguru 是一个Python 简易且强大的第三方日志记录库&#xff0c;该库旨在通过添加一系列有用的功能来解决标准记录器的注意事项&#xff0c;从而减少 Python 日志记录的痛苦。 使用自带自带的 logging 模块的话&#xff0c;则需要…

机器学习笔记 - 使用 PyTorch 的多任务学习和 HydraNet

一、HydraNet简述 特斯拉使用了一个模型可以解决他们正在处理的每一项可能的任务。 例如:物体检测、道路曲线估计、深度估计、3D重建、视频分析、物体追踪、ETC等等。 以下是在 NVIDIA GPU 上以 3 种不同配置运行的 2 个计算机视觉模型的基准测试。 在第一个配置中,我…

柯桥会计培训|中级会计职称,考过中级,可以从事哪些工作?

拿下中级会计证书后&#xff0c;可以从事哪些工作呢&#xff1f;一起来看看吧~ 财务经理 财务经理可以说是会计人梦寐以求的岗位&#xff0c;上可以和老板畅聊公司财务情况&#xff0c;下可以管理整个财务部。但是在财务管理水平日益成为企业核心竞争力的今天&#xff0c;企业…

软件工程--软件过程学习笔记

本篇内容是对学校软件工程课堂内容的记录总结&#xff0c;部分也来源于网上查找的资料 软件过程基础 软件过程是指在软件开发过程中&#xff0c;经过一系列有序的步骤和活动&#xff0c;从问题定义到最终软件产品交付和维护的全过程。这个过程旨在确保软件项目能够按时、按预…

AWS EC2、阿里云ECS、腾讯云CVM初步对比

作为国内外的头部云厂商&#xff0c;AWS、阿里云、腾讯云都有着相似功能的云产品&#xff0c;而作为云上最基础的资源就是云服务器——一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件&#xff0c;即可迅速创建…

QtCreator开发环境的安装和配置

QtCreator开发环境的安装和配置 介绍下载与安装环境介绍示例新建工程示例程序 帮助模式Qt Designer(设计师)Qt Linguist(预言家)结论 介绍 Qt Creator是一个跨平台、完整的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于Qt开发。它包含了完整的编辑器、调试器和…

电子电器架构 —— 车载网关边缘节点总线转换

电子电器架构 —— 车载网关边缘节点路由转发策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数3000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无…

【C/C++笔试练习】继承和派生的概念、虚函数的概念、派生类的析构函数、纯虚函数的概念、动态编译、多态的实现、参数解析、跳石板

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;继承和派生的概念&#xff08;2&#xff09;程序分析&#xff08;3&#xff09;虚函数的概念&#xff08;4&#xff09;派生类的析构函数&#xff08;5&#xff09;纯虚函数的概念&#xff08;6&#xff09;动态编译&…

docker 安装mongodb 实现 数据,日志,配置文件外挂

docker 安装mongodb 实现数据&#xff0c;日志&#xff0c;配置文件外挂 1 背景 最近开发了一个评论系统之前用mysql来存储数据&#xff0c;但是考虑到后期业务增大访问量也会增大&#xff0c;为了兼容这种高并发的场景&#xff0c;因此经过多方面的考虑&#xff0c;我们最终…

python中的NumPy和Pandas往往都是同时使用,NumPy和Pandas的在数据分析中的联合使用

文章目录 前言一、numpy的介绍与用法二、pandas的介绍与用法三、numpy与pandas的联合使用说明四、numpy与pandas的联合使用程序代码4.1 读取CSV文件并进行数据清洗&#xff0c;如去除NaN值4.2 矩阵操作和特征工程&#xff0c;如标准化处理4.3 使用Pandas进行数据筛选和分组聚合…

Vue3-shallowRef 和 shallowReactive函数(浅层次的响应式)

Vue3-shallowRef 和 shallowReactive函数&#xff08;浅层次的响应式&#xff09; shallowRef函数 功能&#xff1a;只给基本数据类型添加响应式。如果是对象&#xff0c;则不会支持响应式&#xff0c;层成也不会创建Proxy对象。ref和shallowRef在基本数据类型上是没有区别的…

Typora——优雅的排版也是一种品味

电脑中用于编辑文本的软件&#xff0c;一直以来可谓是层出不穷&#xff0c;大家脑海中一定会浮现出很多名字&#xff1a;word&#xff0c;OneNote&#xff0c;记事本&#xff0c;wps&#xff0c;LaTeX&#xff0c;还有各种小众的office工具&#xff0c;等等等等。今天学长将介绍…

人充当LLM Agent的工具(Human-In-The-Loop ),提升复杂问题解决成功率

原文&#xff1a;人充当LLM Agent的工具&#xff08;Human-In-The-Loop &#xff09;&#xff0c;提升复杂问题解决成功率 在Agent开发过程中&#xff0c;LLM充当Agent的大脑&#xff0c;对问题进行规划、分解、推理&#xff0c;在执行过程中合理选择利用工具&#xff08;Tool&…

一款.NET开源的小巧、智能、免费的Windows内存清理工具 - WinMemoryCleaner

前言 我们在使用Windows系统的时候经常会遇到一些程序不会释放已分配的内存&#xff0c;从而导致电脑变得缓慢。今天给大家推荐一款.NET开源的小巧、智能、免费的Windows内存清理工具&#xff1a;WinMemoryCleaner。 使用Windows内存清理工具来优化内存&#xff0c;这样不必浪…

图像分类(二) 全面解读复现ZFNet

网络详解 前言&#xff1a;ZF网络是2013年提出的&#xff0c;网上有很多关于它的介绍和讲解&#xff0c;但是很多内容讲的不太好&#xff08;个人感觉&#xff09;&#xff0c;于是花时间收集了一些资料&#xff0c;整理了一些比较好的文章&#xff0c;从头到尾把ZFNet说了一遍…

Spring Cloud Alibaba微服务组件-Nacos-配置中心

Nacos做注册中心是以serviceName做基本管理单元&#xff0c;而作为配置中心则是以dataId为基本管理单元&#xff0c;dataId也就是配置文件名 使用 配置中心架构图 多个配置的优先级 配置动态更新 客户端 ConfigService 输出&#xff1a; 通过调用Nacos服务端的“获取配置”接口…

ubuntu20.04.1网络图标突然消失,无法上网

故障&#xff1a;打开虚拟机进入Ubuntu系统后&#xff0c;打开火狐浏览器&#xff0c;发现无法连接网络。 解决办法&#xff1a;因为刚接触Linux系统&#xff0c;就在网上找各种资料&#xff0c;试了各种办法无果&#xff0c;最后发现有可能网络配置文件被更改。 打开控制台输…

Qt6版使用Qt5中的类遇到的问题解决方案

如果有需要请关注下面微信公众号&#xff0c;会有更多收获&#xff01; 1.QLinkedList 是 Qt 中的一个双向链表类。它提供了高效的插入和删除操作&#xff0c;尤其是在中间插入和删除元素时&#xff0c;比 QVector 更加优秀。下面是使用 QLinkedList 的一些基本方法&#xff1a…

腾讯云服务器新用户优惠有哪些?腾讯云服务器新人优惠整理汇总

你们是否曾经幻想过拥有一台属于自己的服务器&#xff0c;却因为价格而望而却步呢&#xff1f;今天&#xff0c;我要告诉你一个好消息——腾讯云服务器现在针对新用户推出了一系列的优惠政策&#xff0c;让你可以用超低的价格购买到性能强大的服务器&#xff01; 首先&#xf…