string的实际应用 -- 大数相加 、大数相乘

news2024/11/25 5:41:56

前言:哎,做题好难o(╥﹏╥)o,有时候想不到,而有时候则是想到了却没办法理清思路,转化为代码。有必要反思了┓(;´_`)┏,是否是做的太少了,或是自己的基础欠缺。

        大学总是有些迷茫~

                                ​​​​​​​        ​​​​​​​        


大数相加:

        就简单的加法而言,我觉得口算也是很快了,生活完全够用,但一旦上了几十几百或更多,并且不是整十整百的,嗯~实在是难为我,有时候在家父母有时也揪着不放:“都上大学得到人了,口算这么差?” 我又不是人形计算器!!况且,就大学生而言,平均来说,是不是有些高估了?

(= ̄ω ̄=)喵了个咪

        回归正题,大数相加,嗯,很大很大的数,有可能会溢出的那种┗( ▔, ▔ )┛。使用 return x * y; 这种明显不行了,换种思路,就到了今天我要说的了,对!就是将其用string解决。

        但到底怎么解决呢?有些头疼呢~~

        有兴趣的可以先思考思考,再往下面看。

思路:想想我们平常是怎么计算的?

                                 

                            1  2  3
                        +   2  3  4
                        -------------
                            3  5  7

                        遇到进位:

                            4  5  6
                        +   7  8  9
                        -------------
                                  15
                        向前进1
                               1  5
                        -------------
                              14  5
                        -------------
                            1<-4  5
                        --------------
                         1<-12 4  5
                        --------------
                         1  2  4  5

        小学就学过吧,想不到最年幼时学的东西竟可以陪伴我这么久,并且还是最实用的

!!!∑(゚Д゚ノ)ノ

        不妨,我们就来模拟这个过程:将大数变为一位一位的小数相加

        首先,这好像跟我们的string的顺序相反哎!!!怎么办?难道就这么放弃了吗?不,不如就反着算!最后再倒过来就行了。

        那么,首先的把字符转化为数字,好说好说:x - '0' 即可,然后再相加,但得标记一下进位,于是:

//数一:num1  数二: num2
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
int next = 0;
//一个简单的三目操作符完成字符与数的转换
int n1 = end1 >= 0 ? num1[end1] - '0' : 0;
int n2 = end2 >= 0 ? num2[end2] - '0' : 0;

int x = n1 + n2 + next;
next = x / 10;
x %= 10;

//最后,next就是进位了,  x就是最低位相加的结果了

//找个字符串先存起来再说
string retnum;
retnum += (x + '0');

        数字可能有很多位,用循环即可,每一次加在retnum后面就行了

string retnum;
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
int next = 0;
while (end1 >= 0 || end2 >= 0)
{
	int n1 = end1 >= 0 ? num1[end1--] - '0' : 0;
	int n2 = end2 >= 0 ? num2[end2--] - '0' : 0;

	int x = n1 + n2 + next;
	next = x / 10;
	x %= 10;
	//retnum.push_back(x + '0');
	retnum += ('0' + x);
}
当然,最高位相加也是有可能进位的!
if (next != 0)
{
	retnum += '1';
}

最后反转一下

reverse(retnum.begin(), retnum.end());

        欧耶!终于完成了!

        写完代码总是让我有很强的满足含感,不知道各位如何。

以下是完整代码,有需要的小伙伴可以自取:

class Solution {
public:
	string addStrings(string num1, string num2)
	{
		string retnum;
		int end1 = num1.size() - 1;
		int end2 = num2.size() - 1;
		int next = 0;
		while (end1 >= 0 || end2 >= 0)
		{
			int n1 = end1 >= 0 ? num1[end1--] - '0' : 0;
			int n2 = end2 >= 0 ? num2[end2--] - '0' : 0;

			int x = n1 + n2 + next;
			next = x / 10;
			x %= 10;
			//retnum.push_back(x + '0');
			retnum += ('0' + x);
		}
		if (next != 0)
		{
			retnum += '1';
		}
		reverse(retnum.begin(), retnum.end());

		return retnum;
	}

};

        做完总得试一试呗:

int main()
{
    Solution S;
    string ret = S.addStrings("1234", "3457800000");
    cout << ret << endl;

    string ret1 = S.addStrings("1234452523", "345780000023");
    cout << ret1 << endl;
    return 0;
}

//3457801234
//347014452546
//2460

//D:\编程\text_c\greate_number_add\x64\Debug\greate_number_add.exe (进程 2344)已退出,代码为 //0 (0x0)。
//按任意键关闭此窗口. . .

大数相乘:

        做完了大数相加,额,来个大数相乘练练手!(信心满满)

..............................

        啊,貌似有些难度!

        相乘的话,就不是简单的想同位相加(乘)了,每一位都得乘,这得很多位啊,数越大越多,脑子好像有些不够用了⊙(・◇・)?!!

        别急,来让我们细细思考:平时我们在草稿纸上是怎么做的?

        数一与数二相乘,数二的每一位都与数一的每一位相乘,并且随着数二从个位到百位千位......相乘所得的结果也在变大,即“天生进位!”(我命名的)。

        数二的所有位与数一相乘后,最后相加得结果。

        大数相加在上面我们已经完成了,接下来,只需要实现数二的每一位都与数一的每一位相乘,并且“天生进位”就可以了。

string multiply(string num1, string num2) {
	if (num1 == "0" || num2 == "0")
		return"0";

	int end1 = num1.size() - 1;
	int end2 = num2.size() - 1;
    //定义一个字符串,用于记录每次相加的结果,最后用于返回
	string retnum("0");

	for (int i = end2; i >= 0; i--)
	{
        //标记进位
		int next = 0;
		string cur;
        //char转int
		int x = num2[i] - '0';
		for (int j = end2; j > i; j--)
		{
            //这一步就是用于数二数位的变大而准备的“天生进位”
			cur.push_back('0');
		}
		for (int j = end1; j >= 0; j--)
		{
            //这里代码与大数相加很相似,只不过加换做了乘
			int y = num1[j] - '0';
			int n = x * y + next;
			next = n / 10;
			n %= 10;
			cur.push_back('0' + n);
		}
        //注意,由于是乘法,进位的数字有可能较大
		while (next != 0)
		{
			cur.push_back(next % 10 + '0');
			next /= 10;
		}
        //反转
		reverse(cur.begin(), cur.end());
		
        //在这numadd就是大数相加了
		retnum = numadd(retnum, cur);
	}

	return retnum;
}

        有大数相加的经验,我就不一一细讲了,相信你们举一反三都是手拿把掐!!

        这里是完整代码,有需自取:

//大数相乘
class Solution1 {
public:
	string multiply(string num1, string num2) {
		if (num1 == "0" || num2 == "0")
			return"0";

		int end1 = num1.size() - 1;
		int end2 = num2.size() - 1;
		string retnum("0");

		for (int i = end2; i >= 0; i--)
		{
			int next = 0;
			string cur;

			int x = num2[i] - '0';
			for (int j = end2; j > i; j--)
			{
				cur.push_back('0');
			}
			for (int j = end1; j >= 0; j--)
			{
				int y = num1[j] - '0';
				int n = x * y + next;
				next = n / 10;
				n %= 10;
				cur.push_back('0' + n);
			}
			while (next != 0)
			{
				cur.push_back(next % 10 + '0');
				next /= 10;
			}

			reverse(cur.begin(), cur.end());
			
			retnum = numadd(retnum, cur);
		}

		return retnum;
	}

	string numadd(string num1, string num2)
	{
		string retnum;
		int end1 = num1.size() - 1;
		int end2 = num2.size() - 1;
		int next = 0;
		while (end1 >= 0 || end2 >= 0)
		{
			int n1 = end1 >= 0 ? num1[end1--] - '0' : 0;
			int n2 = end2 >= 0 ? num2[end2--] - '0' : 0;

			int x = n1 + n2 + next;
			next = x / 10;
			x %= 10;
			//retnum.push_back(x + '0');
			retnum += ('0' + x);
		}
		if (next != 0)
		{
			retnum += '1';
		}
		reverse(retnum.begin(), retnum.end());

		return retnum;
	}
};

        好了,本次分享就结束了,谢谢观看!!


         但学习之路永无止境,即使是跑一会歇一会,我也会向前进!!

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

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

相关文章

STM32-- keil 的option for target使用

keil版本号 1.device界面 如&#xff1a;stm32f103c8t6的工程&#xff0c;可以直接在device这里修改成stm32f103vct6&#xff0c;虽然引脚不一样&#xff0c;但是很多一样的地方&#xff0c;可以直接使用&#xff0c;有些不修改也可以下载程序。 2.target xtal的设置不起作用了…

shell脚本9完结,保姆篇---春不晚

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…

【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)

宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市住宿服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、各区…

RabbitMQ和RocketMQ相关面试题

RabbitMQ和RocketMQ面试题 RabbitMQ1.RabbitMQ各部分角色2.如何确保RabbitMQ消息的可靠性&#xff1f;3.什么样的消息会成为死信&#xff1f;4.死信交换机的使用场景是什么&#xff1f;5.TTL6.延迟队列7.消息堆积问题8.MQ集群 RocketMQ1.RocketMQ各部分角色2.RocketMQ如何保证高…

在kali用msfpc远程控制Windows

本次实验我们将使用msfpc生成windows下的被控端&#xff0c;并使用metasploit渗透工具进行远程控制。 一、实验环境 Windows主机IP&#xff1a; 192.168.167.1 虚拟机Kali IP&#xff1a; 192.168.167.100 二、实验过程 1、安装msfpc apt-get install msfpc 2、生成windows…

SDIO WIFI模组Clock EMC问题

问题&#xff1a; 某产品采用SDIO3.0的WIFI模组&#xff0c;测试3米场地辐射出现333MHz和500MHz频点超标。 分析&#xff1a; 1、一开始分析板子上没有对应333MHz,499.5MHz的频点倍频&#xff0c;因此直接拔掉产品上所有的外部接线&#xff0c;测试还是超标。表明辐射源头出…

MCU(一) 时钟详解 —— 以 GD32E103 时钟树结构为例

微控制器 (MCU) 的时钟系统是系统运行的核心&#xff0c;它提供了各模块所需的时钟信号。本文以 GD32E103 系列 MCU 为例&#xff0c;详细讲解其 时钟树结构&#xff08;Clock Tree&#xff09;。通过理解时钟源、分配与预分频器设置&#xff0c;可以灵活配置系统时钟以实现高性…

【方案库】从单张照片快速重建3D场景:Flash3D详解

一、Flash3D是什么? Flash3D 是一项革命性的AI技术,能够从单张普通照片快速重建3D场景。简单来说,你只需要提供一张照片,Flash3D 就能帮你还原出这个场景的立体效果。这项技术在房地产、建筑设计、虚拟现实等多个领域都有着广泛的应用前景。 二、主要特点 一张就够:只需…

QT QFormLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例&#xff0c;包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizonta…

如何在 Ubuntu 22.04 上安装 Metabase 数据可视化分析工具

简介 Metabase 提供了一个简单易用的界面&#xff0c;让你能够轻松地对数据进行探索和分析。通过本文的指导&#xff0c;你将能够在 Ubuntu 22.04 系统上安装并配置 Metabase&#xff0c;并通过 Nginx 进行反向代理以提高安全性。本教程假设你已经拥有了一个非 root 用户&…

c#:winform调用bartender实现打印(学习整理笔记)

效果 学习路径 C# winform调用Bartender进行自定义打印、批量打印、检索文件夹中的模板_哔哩哔哩_bilibili 一、初始环境搭建见&#xff1a; c#:winform引入bartender-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/143989473?sharetypeblogdetail&s…

1123--日期类

目录 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作 一 java 1. Date类 2. calendar类 3. 第三代日期类‘ 3.1 常用方法 3.2 格式化操作

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

InstantStyle容器构建指南

一、介绍 InstantStyle 是一个由小红书的 InstantX 团队开发并推出的图像风格迁移框架&#xff0c;它专注于解决图像生成中的风格化问题&#xff0c;旨在生成与参考图像风格一致的图像。以下是关于 InstantStyle 的详细介绍&#xff1a; 1.技术特点 风格与内容的有效分离 &a…

使用EFK收集k8s日志

首先我们使用EFK收集Kubernetes集群中的日志&#xff0c;本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群&#xff0c;如果企业内已经有了Elasticsearch集群&#xff0c;可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…

Rust 力扣 - 2266. 统计打字方案数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题可以先求按了多少次相同连续的按钮&#xff0c;所有的连续相同按钮表示的方案数的乘积就是本题答案 我们的关键问题就转换成了按n个连续相同按钮表示的方案数 设f(i)表示按i个连续相同按钮表示的方案数 如…

[Redis#0] iredis: linux上redis超好用的环境配置

目录 Features 特征 Install 安装 Pip Brew Linux的 Download Binary 下载 Binary Usage 用法 Using DSN 使用 DSN Change The Default Prompt更改默认提示 Configuration 配置 Keys Development 发展 Release Strategy 发布策略 Setup Environment 设置环境 De…

flutter 专题十七 Flutter Flar动画实战

Flutter Flar动画实战 在Flare动面出现之前&#xff0c;Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画&#xff0c;如果遇到一些复杂的场景&#xff0c;使用这些动画方案实现起来还是有难度的。不过&#xff0c;随着Flutter开始支持Flar…

Wekan看板安装部署与使用介绍

Wekan看板安装部署与使用介绍 1. Wekan简介 ​ Wekan 是一个开源的看板式项目管理工具&#xff0c;它的配置相对简单&#xff0c;因为大多数功能都是开箱即用的。它允许用户以卡片的形式组织和跟踪任务&#xff0c;非常适合敏捷开发和日常任务管理。Wekan 的核心功能包括看板…

使用ENSP实现静态路由

一、双路由器静态路由 1.项目拓扑 2.项目实现 (1)路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为1.1.1.1/24 ip address 1.1.1.1 24进入g0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置为192.168.1.1/24 ip ad…