zoukankan      html  css  js  c++  java
  • AcWing 791. 高精度加法 解题记录

    题目地址 https://www.acwing.com/problem/content/description/793/

    题目描述
    给定两个正整数,计算它们的和。

    输入格式
    共两行,每行包含一个整数。

    输出格式
    共一行,包含所求的和。

    算法
    很明显 输入会超过64位 也就是即使long long 类型也不能进行常规加法
    那么输入就是用string 接收字符串 来模拟加法

    加法主要是三个数字的相加 数字a 数字b 以及进位
    所以 int sum = (a - '0') + (b - '0') + next;
    然后得到除开进位后本地应该显示的数字 int local = sum % 10;
    计算进位 next = sum / 10;
    由于加法是从最小位开始的 所以字符串做了逆转

    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    还要考虑数字a 和数字b 位数不同的情况

    while (i < a.size() && i < b.size()) {
    add(a[i], b[i], next);
    i++;
    }

    while (i < a.size()) {
    add(a[i], '0', next);
    i++;
    }

    while (i < b.size()) {
    add('0', b[i], next);
    i++;
    }
    还有一种特殊情况,最后一位还要进位
    也就是最后的和 比最大的数还要多一位1 记得最后判断下

    if (next == 1)
    v.push_back(1);
    最后显示记录结果 记得也要做逆转

    reverse(v.begin(), v.end());
    for (int i = 0; i < v.size(); i++)
    {
    cout << v[i];
    }

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <vector>
     5 
     6 
     7 using namespace std;
     8 
     9 string a,b;
    10 vector<int> v;
    11 
    12 void add(int a,int b,int& next)
    13 {
    14     int sum = (a - '0') + (b - '0') + next;
    15     int local = sum % 10;
    16     v.push_back(local);
    17     next = sum / 10;
    18 }
    19 
    20 int main()
    21 {
    22     cin >> a >> b;
    23 
    24     reverse(a.begin(),a.end());
    25     reverse(b.begin(), b.end());
    26 
    27     int i = 0; int next = 0;
    28     while (i < a.size() && i < b.size()) {
    29         add(a[i],b[i],next);
    30         i++;
    31     }
    32 
    33     while (i < a.size()) {
    34         add(a[i],'0',next);
    35         i++;
    36     }
    37 
    38     while (i < b.size()) {
    39         add('0',b[i],next);
    40         i++;
    41     }
    42     if (next == 1)
    43         v.push_back(1);
    44     reverse(v.begin(), v.end());
    45     for (int i = 0; i < v.size(); i++)
    46     {
    47         cout << v[i];
    48     }
    49 
    50 
    51     return 0;
    52 
    53 }
    54 
    55 
    56 作者:defddr
    57 链接:https://www.acwing.com/solution/AcWing/content/2074/
    58 来源:AcWing
    59 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    View Code
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    IIS10中使用OpenSSL来创建CA并且签发SSL证书
    vim简单题练习-------出自《鸟哥的linux私房菜》第309页码题目
    Linux删除命令rm
    CentOS下Vim加密解密文本
    Linux中bash shell环境变量
    Linux文件系统损坏导致无法正常启动与fsck修复工具
    rm -rf /*时遇到的趣事
    Linux中tree无法正常显示中文的解决方法
    执行shell脚本的四种方式
    私有网络(VPC)概述
  • 原文地址:https://www.cnblogs.com/itdef/p/10886583.html
Copyright © 2011-2022 走看看