首页 > 其他分享 >洛谷题单指南-模拟和高精度-P1601 A+B Problem

洛谷题单指南-模拟和高精度-P1601 A+B Problem

时间:2024-01-17 23:24:25浏览次数:39  
标签:10 结果 int 洛谷题 vector P1601 Problem 进位 size

原题链接:https://www.luogu.com.cn/problem/P1601

题意解读:本题是高精度加法的模版题。

知识点解析:

  高精度加法:

  如果一个数大到远超过整形变量的范围时,就不能使用int、long、long long等变量来存储整数,也不能直接通过变量加法来求和。

  因此,需要回到加法计算的本质,从个位开始,逐位相加,即可求得结果,要实现该操作,需要解决几个关键问题:

  1、 整数的存储

  要实现逐位相加,必须将数的每一个数字拆解出来,用数组存储,实际编程中,用vector更方便。

  比如:数字12345存储到vector中,是将数字当做string来处理,从后往前遍历,依次提取数字存入vector

    string a  = "12345";
    vector<int> aa;
    for(int i = a.size() - 1; i >= 0; i--) 
        aa.push_back(a[i] - '0');

  2、加法操作

  逐位相加时,当前位的结果是两个数字相加%10,再加上上一位的进位,举例:

  计算12345 + 789

  12345存储为{5, 4, 3, 2, 1}

  789存储为{9, 8, 7}

  个位在前是为了便于优先计算个位,另外定义一个vector数组用来存储结果,初始值{ }

  第一步:计算5 + 9 = 14,当前位的结果是14 % 10 = 4,本次进位是14 / 10 = 1,

  此时结果为{4}

  第二步:计算4 + 8 = 12, 当前位的结果是12 % 10 + 上一次的进位 = 3,本次进位是12 / 10 = 1,

  此时结果为{4, 3}

  第三步:计算3 + 7 = 10, 当前位的结果是10 % 10 + 上一次的进位 = 1,本次进位是10 / 10 = 1,

  此时结果为{4, 3, 1}

  第四步:12345计算到2了,789各个数字都已计算完,因此当前位的结果是2 % 10 + 上一次的进位 = 3,本次进位是2 / 10 = 0,

  此时结果为{4, 3, 1, 3}

  第五步:12345计算到1了,789各个数字都已计算完,因此当前位的结果是1 % 10 + 上一次的进位 = 1, 本次进位是1 / 10 = 0,

  此时结果为{4, 3, 1, 3, 1},转成数字即13134。

  3、收尾

  最后一次数字计算之后,要判断进位,如果进位是0,则当前结果即最终结果,如果进位是1,则结果数组还需要加入1,

  举例:计算56 + 78

  第一步计算6 + 8,结果4,进位1,当前和的结果{4};

  第二步计算5 + 7,结果3,进位1,当前和的结果{4, 3};

  数字全部计算完毕,进位是1,当前和的结果是{4, 3, 1},转成数字即134。

100分代码:

 

#include <bits/stdc++.h>
using namespace std;

vector<int> add(vector<int> a, vector<int> b)
{
    vector<int> res; //结果
    int t = 0; // 进位

    int len = max(a.size(), b.size());
    for(int i = 0; i < len; i++)
    {
        if(i < a.size()) t += a[i];
        if(i < b.size()) t += b[i];
        res.push_back(t % 10);
        t = t / 10;
    }
    if(t) res.push_back(t);
    return res;
}

int main()
{
    string a, b;
    cin >> a >> b;

    vector<int> aa;
    vector<int> bb;

    for(int i = a.size() - 1; i >= 0; i--) aa.push_back(a[i] - '0');
    for(int i = b.size() - 1; i >= 0; i--) bb.push_back(b[i] - '0');

    vector<int> result = add(aa, bb);

    for(int i = result.size() - 1; i >= 0; i--) cout << result[i];

    return 0;
}

 

标签:10,结果,int,洛谷题,vector,P1601,Problem,进位,size
From: https://www.cnblogs.com/jcwy/p/17971456

相关文章

  • 洛谷题单指南-模拟和高精度-P1563 [NOIP2016 提高组] 玩具谜题
    原题链接:https://www.luogu.com.cn/problem/P1563题意解读:本题关键在于根据小人的朝向和寻找的方向来确定数组下标的变化。用数组存储小人,intd[]存朝向,inta[]存名称,朝向和寻找方向有4种组合:朝向(0:向内,1:向外)  寻找方向(0:左,1:右)  数组下标操作00顺时针寻找,下标递减......
  • 洛谷题单指南-模拟和高精度-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • AtCoder Beginner Contest 335 G Discrete Logarithm Problems
    洛谷传送门AtCoder传送门考虑若我们对于每个\(a_i\)求出来了使得\(g^{b_i}\equiva_i\pmodP\)的\(b_i\)(其中\(g\)为\(P\)的原根),那么\(a_i^k\equiva_j\pmodP\)等价于\(kb_i\equivb_j\pmod{P-1}\),有解的充要条件是\(\gcd(b_i,P-1)\midb_j\)。显然......
  • CF1006E Military Problem 题解
    CF1006EMilitaryProblem题解题意给定一颗有\(n\thinspace(2\leqn\leq2\times10^5)\)个节点的树,树根为\(1\)。对于每个节点\(i\thinspace(2\leqi\leqn)\)都有它的父节点\(p_i\),并且每个节点的子节点都是按从小到大的顺序排列的的。有\(q\thinspace(1......
  • Problem I Like
    \(\LARGE{\frac{\frac{\int_{0}^{+\infty}e^{-s}s^5ds}{2}+\frac{\int_{0}^{+\infty}e^{-\frac{t^2}{2}}dt}{\int_{0}^{+\infty}\sint^2dt}(\frac{\sum_{n=0}^{+\infty}\frac{(-1)^n}{2n+1}}{\int_{0}^{+\infty}\frac{\sinx}{x}dx}+\frac{\sum_{n......
  • CF1916D Mathematical Problem
    思路很不错的人类智慧题。拿到以后,完全没有思路,看到数据范围,感觉是什么\(n^2\logn\)的逆天做法,但是又完全没思路,看后面的题感觉没希望,就在这道题死磕。先打了个暴力程序,发现平方数太多,没什么规律,就拿了个map统计一下那些出现数字方案拥有的平方数比较多程序如下:#include......
  • D. Yet Another Inversions Problem
    D.YetAnotherInversionsProblemYouaregivenapermutation$p_0,p_1,\ldots,p_{n-1}$ofoddintegersfrom$1$to$2n-1$andapermutation$q_0,q_1,\ldots,q_{k-1}$ofintegersfrom$0$to$k-1$.Anarray$a_0,a_1,\ldots,a_{nk-1}$oflength$n......
  • 【模版】高精度减法 (A - B problem)
    直接看代码和注释吧qwq高精度就是模拟嘛ww还是python好,自带高精度#include<bits/stdc++.h>#defineMAXN10500usingnamespacestd;stringa,b;//选择字符串。因为字符串储存了每个串的长度,可以直接调用。intna[MAXN],nb[MAXN],ans[MAXN];boolpd;intmain(){......
  • 【模版】高精度乘法 (A*B problem)
    和A+Bproblem类似,不多说,直接看代码和注释就好啦!ww感觉这东西只要有个概念就行了...就是在练模拟?www其他语言似乎有大数加减乘除? 这样的高精度算法时间复杂度O(n2),n是数字位数,如果位数过大还是很慢。可以利用快速傅里叶变换的方式加速高精度乘法。(虽然都是我连傅里叶级数都没学......
  • CodeForces 1909F2 Small Permutation Problem (Hard Version)
    洛谷传送门CF传送门感觉这个题还是挺不错的。考虑F1。考察\(a_i\)差分后的意义,发现\(a_i-a_{i-1}\)就是\((\sum\limits_{j=1}^{i-1}[p_j=i])+p_i\lei\)。考虑将其转化为棋盘问题。在\((i,p_i)\)放一个车,那么\(a_i-a_{i-1}\)就是\((1,i)\sim......