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

news2025/1/19 11:14:48

一、高精度数 × 低精度数

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;
} 

今日收获

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java Could not resolve placeholder

1、参考&#xff1a;https://blog.csdn.net/yu1812531/article/details/123466616 2、配置文件: 3、在application.properties中设置要使用的配置文件

APIcloud 【现已更名 用友开发中心】 iOS发版 应用程序请求用户同意访问相机和照片,但没有在目的字符串中充分说明相机和照片的使用。

iOS 审核时 提示 首次安装软件 获取相机 相册 提示信息 怎么修改 我们注意到你的应用程序请求用户同意访问相机和照片&#xff0c;但没有在目的字符串中充分说明相机和照片的使用。 为了解决这个问题&#xff0c;修改应用信息中的目的字符串是合适的。相机和照片的Plist文件&a…

【giszz笔记】产品设计标准流程【6】

目录 六、组织评审 1.评审的类型 2.评审的人员——谁参加评审 3.评审的核心——怎么提问 & 答案谁说了算 4.评审的流程——前中后三部曲 5.评审的标的——漂亮的靶子 6.避免被“烤”问的一些技巧 7.搞几次评审比较好 这个产品设计系列&#xff0c;陆陆续续写了6篇了…

【DevOps】Git 图文详解(三):常用的 Git GUI

Git 图文详解&#xff08;三&#xff09;&#xff1a;常用的 Git GUI 1.SourceTree2.TortoiseGit3.VSCode 中的 Git 如果不想用命令行工具&#xff0c;完全可以安装一个 Git 的 GUI 工具&#xff0c;用的更简单、更舒服。不用记那么多命令了&#xff0c;极易上手&#xff0c;不…

C++初阶 日期类的实现(下)

目录 一、输入输出(>>,<<)重载的实现 1.1初始版 1.2友元并修改 1.2.1简单介绍下友元 1.2.2修改 1.3>>重载 二、条件判断操作符的实现 2.1操作符的实现 2.2!操作符的实现 2.3>操作符的实现 2.4>,<,<操作符的实现 三、日期-日期的实现 …

深入理解网络协议:通信世界的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;网络协议是连接世…

Intellij Idea屏蔽日志/过滤日志

一、安装插件 Grep Console 二、设置关键词&#xff0c;过滤日志 关键词的前后加上 .* 符号&#xff0c;类似&#xff1a; .*关键词.*设置后 &#xff0c;点击 Apply 即可过滤日志。

上网行为审计软件能审计到什么

上网行为审计软件是一种用于监控和分析员工在工作时间使用互联网行为的软件工具。这种软件可以帮助企业管理员工在工作时间内的互联网使用情况&#xff0c;以确保员工的行为符合企业规定和法律法规。 域之盾软件---上网行为审计软件可以审计到以下内容&#xff1a; 1、网络访问…

FFmpeg 6.1 发布,7.0时代即将来临

11月10日&#xff0c;FFmpeg 6.1正式发布。 FFmpeg 发布版本的时候&#xff0c;按照惯例&#xff0c;会选择一些物理学家名字作为代号&#xff0c;这一新版本代号为“Heaviside”。主要为纪念伟大的英国数学家和物理学家奥利弗黑维塞&#xff08;Oliver Heaviside)。 奥利弗黑维…

Vulhub靶场-KIOPTRIX: LEVEL 1

目录 环境配置 端口扫描 漏洞发现 mod_ssl漏洞利用 Samba远程代码执行漏洞利用 环境配置 首先去官网下载靶场导入到虚拟机中 下载地址&#xff1a;Kioptrix: Level 1 (#1) ~ VulnHub 下载完成之后导入到vmware中 这里需要改nat&#xff0c;桥接模式的靶机拿不到IP&…

Windows10下Tomcat8.5安装教程

文章目录 1.首先查看是否安装JDK。2.下载3.解压到指定目录&#xff08;安装路径&#xff09;4.启动Tomcat5.常见问题5.1.如果出现报错或者一闪而过5.2.Tomcat乱码 1.首先查看是否安装JDK。 CMD窗口输入命令 java -version 2.下载 历史版本下载地址&#xff1a;https://archi…

tomcat8.5处理get请求时,控制台输出中文乱码问题的解决

问题描述 控制台输出中文乱码 版本信息 我使用的是tomcat8.5 问题解决 配置web.xml 注&#xff1a;SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前&#xff0c;否则无效 <!--配置springMVC的编码过滤器--> <filter><filter-name>CharacterEn…

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

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

量化交易:公司基本面的量化

公司的基本面因素一直具备滞后性&#xff0c;令基本面的量化出现巨大困难。而从上市公司的基本面因素来看&#xff0c;一般只有每个季度的公布期才会有财务指标的更新&#xff0c;而这种财务指标的滞后性对股票表现是否有影响呢&#xff1f;如何去规避基本面滞后产生的风险呢&a…

openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库

文章目录 openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库126.1 前提条件126.2 背景信息126.3 操作步骤 openGauss学习笔记-126 openGauss 数据库管理-设置账本数据库-归档账本数据库 126.1 前提条件 系统中需要有审计管理员或者具有审计管理员权…

图像分类(一) 全面解读复现AlexNet

解读 论文原文&#xff1a;http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf Abstract-摘要 翻译 我们训练了一个庞大的深层卷积神经网络&#xff0c;将ImageNet LSVRC-2010比赛中的120万张高分辨率图像分为1000个不…

【Python自动化】定时自动采集,并发送微信告警通知,全流程案例讲解!

文章目录 一、概要二、效果演示三、代码讲解3.1 爬虫采集行政处罚数据3.2 存MySQL数据库3.3 发送告警邮件&微信通知3.4 定时机制 四、总结 一、概要 您好&#xff01;我是马哥python说&#xff0c;一名10年程序猿。 我原创开发了一套定时自动化爬取方案&#xff0c;完整开…

【18年扬大真题】定义一个类Student记录学生计算机课程的成绩。要求使用静态成员变量或静态成员函数计算全班学生计算机课程的总成绩和平均成绩

【18年扬大真题】 定义一个类Student记录学生计算机课程的成绩。要求使用静态成员变量或静态成员函数计算全班学生计算机课程的总成绩和平均成绩 #include<stdio.h> #define n 5;//假设5个学生 typedef struct {char name[10];float score; }stu;int main() {printf(&qu…

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

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

初刷leetcode题目(1)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…