牛客网NC1大数加法

2024-08-22 18:04
文章标签 牛客 大数 加法 nc1

本文主要是介绍牛客网NC1大数加法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为要计算的是两个很大很大的数,假设计算出来的数据大于整型的最大值,此时就会出现问题。所以要换个方法来解决问题。

我们应该以字符串的形式来读取两个正整数,并且返回二者相加的结果

我们应该从大数的个位开始,逐级的向上相加进位

下面我们来详细讲解一下大数加法的具体步骤:

1.假设两个字符串中有一个字符串为空,此时直接返回另外一个字符串

		if (s.empty()){return t;}if (t.empty()){return s;}

2.令更长的字符串为s,令短的字符串为t

		if (s.length() < t.length()){swap(s, t);}

3.先创建一个变量用来表示进位,取变量名字为carry,令它的默认值为0

		int carry = 0;

4.从后向前遍历长的字符串,并将它的每一个字符转换为数字并且加上进位,注意这里的个位不需要特殊处理,因为carry默认值是0,加上0不影响个位的结果:

		for (int i = s.length() - 1; i >= 0; i--){int temp = s[i] - '0' + carry;

(注意这里 i 的数据类型不能是size_t,因为这样就会无限循环

5.因为两个字符串的长度可能是不同的,我们要从后向前提取短字符串的数据时,应该先要确定短字符串的下标

			int j = i - s.length() + t.length();

6.接下来我们需要对短字符串进行判断,如果短字符串此时没有处理完,就需要将短字符串当前数位上的字符转换为整型,并且与长字符串同数位上的数相加并取进位,如果相加的结果大于10还要去10

			if (j >= 0){temp += t[j] - '0';}carry = temp / 10;temp = temp % 10;

7.最后我们需要对该数位上面的数进行修改:

			s[i] = temp + '0';}

8.结束循环以后我们需要对最后一次的进位进行处理,因为此时已经出了循环,最后一次进位没有处理

		if (carry == 1){s = '1' + s;}

到这里,所有的代码就已经完成了,我们把代码整合一下:

class Solution
{
public:string solve(string s, string t){if (s.empty()){return t;}if (t.empty()){return s;}if (s.length() < t.length()){swap(s, t);}int carry = 0;for (int i = s.length() - 1; i >= 0; i--){int temp = s[i] - '0' + carry;int j = i - s.length() + t.length();if (j >= 0){temp += t[j] - '0';}carry = temp / 10;temp = temp % 10;s[i] = temp + '0';}if (carry == 1){s = '1' + s;}return s;}
};

我们来试着运行一下代码:

(还可以采取在短字符串前面补0的方法,这里就不做讲解了)

这篇关于牛客网NC1大数加法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1096994

相关文章

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

牛客小白月赛100(A,B,C,D,E,F三元环计数)

比赛链接 官方讲解 这场比较简单,ABC都很签到,D是个不太裸需要预处理的 B F S BFS BFS 搜索,E是调和级数暴力枚举,F是三元环计数。三元环考的比较少,没见过可能会偏难。 A ACM中的A题 思路: 就是枚举每个边变成原来的两倍,然后看看两短边之和是否大于第三边即可。 不能只给最短边乘 2 2 2,比如 1 4 8 这组数据,也不能只给第二短边乘 2 2 2,比

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

找第K大数(ACdream 1099)

瑶瑶的第K大 Time Limit: 4000/2000MS (Java/Others)  Memory Limit: 256000/128000KB (Java/Others) Submit  Statistic  Next Problem Problem Description 一天,萌萌的妹子--瑶瑶(tsyao)很无聊,就来找你玩。可是你们都不知道玩什么。。。

【OpenCV2.2】图像的算术与位运算(图像的加法运算、图像的减法运算、图像的融合)、OpenCV的位运算(非操作、与运算、或和异或)

1 图像的算术运算 1.1 图像的加法运算 1.2 图像的减法运算 1.3 图像的融合 2 OpenCV的位运算 2.1 非操作 2.2 与运算 2.3 或和异或 1 图像的算术运算 1.1 图像的加法运算 add opencv使用add来执行图像的加法运算 图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的. # 图片加法imp