中石油-【高精度】简单高精度加法

问题 B: 【高精度】简单高精度加法

时间限制: 1 Sec  内存限制: 64 MB
提交: 63  解决: 20
[提交][状态][讨论版]

题目描述

修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A、B的和,其中A和B的位数在5000位以内。

输入

共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在5000以内。

输出

输出一个非负数,即两数之和。

样例输入

1111111111
2222222222

样例输出

3333333333

解题思路:两个数位数不同,我这种方法计算的时候需要考虑谁的位数多,也要注意最高位前面预留一进位位。总是觉得自己的算法太复杂,所以容易出错,导致浪费很多时间。这个题记得之前在网上看多一个算法,不用考虑位数多少,回头百度一下。。。好困。。睡觉!

代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char a[5001]={‘0‘};
char b[5001]={‘0‘};
int c[5001]={0};

int main()
{
    int g,s;
    scanf("%s",&a[1]);
    scanf("%s",&b[1]);
    int la=strlen(a);
    int lb=strlen(b);
    if(la<lb){
        for(int i=la-1,j=lb-1,k=lb-1;i>0&&j>0;i--,j--,k--){
            c[k]+=(int)(a[i]-‘0‘)+(int)(b[j]-‘0‘);
            if(c[k]>=10){
                g=c[k]%10;
                s=c[k]/10;
                c[k]=g;
                c[k-1]+=s;
            }
        }
        for(int i=lb-la;i>=0;i--){
            c[i]+=(int)(b[i]-‘0‘);
            if(c[i]>=10){
                g=c[i]%10;
                s=c[i]/10;
                c[i]=g;
                c[i-1]+=s;
            }
        }
    }
    if(la>lb){
        for(int i=lb-1,j=la-1,k=la-1;i>0&&j>0;i--,j--,k--){
            c[k]+=(int)(b[i]-‘0‘)+(int)(a[j]-‘0‘);
            if(c[k]>=10){
                g=c[k]%10;
                s=c[k]/10;
                c[k]=g;
                c[k-1]+=s;
            }
        }
        for(int i=la-lb;i>=0;i--){
            c[i]+=(int)(a[i]-‘0‘);
            if(c[i]>=10){
                g=c[i]%10;
                s=c[i]/10;
                c[i]=g;
                c[i-1]+=s;
            }
        }
    }
    if(la==lb){
        for(int i=lb-1,j=la-1;i>0&&j>0;i--,j--){
            c[i]+=(int)(b[i]-‘0‘)+(int)(a[j]-‘0‘);
            if(c[i]>=10){
                g=c[i]%10;
                s=c[i]/10;
                c[i]=g;
                c[i-1]+=s;
            }
        }
    }
    int l=la>=lb ? la:lb;
    if(c[0]!=0){
        for(int i=0;i<l;i++){
            printf("%d",c[i]);
        }
    }else{
        for(int i=1;i<l;i++){
            printf("%d",c[i]);
        }
    }

    return 0;
}

				
时间: 2024-12-18 18:23:48

中石油-【高精度】简单高精度加法的相关文章

问题 B: 【高精度】简单高精度加法

问题 B: [高精度]简单高精度加法 时间限制: 1 Sec  内存限制: 64 MB提交: 94  解决: 27[提交][状态][讨论版] 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222

POJ 3181 Dollar Dayz(完全背包+简单高精度加法)

POJ 3181 Dollar Dayz(完全背包+简单高精度加法) http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币分别是1美元,2美元-K美元且可以无限使用,问你用上面K种硬币构成n美元的话有多少种方法? 分析: 本题是一道明显的完全背包问题, 不过本题还可以换一种方法来看: 整数n由前K个自然数构造, 一共有多少种方法? (虽然本题要用到高精度加法, 但是很简单, 不要被吓到哦) 首先是DP部分: 令dp[i][j]==x 表示由前i种硬币构成j

中石油-高精度除法-java版

问题 G: [高精度]高精度数除以低精度数I 时间限制: 1 Sec  内存限制: 512 MB提交: 19  解决: 15[提交][状态][讨论版] 题目描述 修罗王聚集了庞大的暗元素以施展隐匿魔法,该魔法施展后将对其周边的时空产生隐匿效果,当然,隐匿的效果好坏取决于是否将暗元素平均地分配在其周边时空,显然这涉及高精度除法的编程.考虑到邪狼的理解能力,修罗王不得不先将问题简化为:输入一被除数(位数≤5000),输入一除数(整型数据范围内),输出整数商,忽略小数. 输入 共两行,第1行为一个数字

简单高精度加法

[高精度]简单高精度加 题目描述 修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A.B的和,其中A和B的位数在5000位以内. 输入 共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A.B的位数均在5000以内. 输出 输出一个非负数,即两数之和. 样例输入 1111111111 2222222222 样例输出 3333333333 #include <bits/stdc++.h> #define N 5000 #d

中石油-高精度阶乘-java

问题 F: [高精度]高精度阶乘 时间限制: 1 Sec  内存限制: 64 MB提交: 49  解决: 13[提交][状态][讨论版] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为<宝典>里记载了很多匪夷所思的魔法原理.例如很久以前,主流魔法界认为传说中的隐身衣是无法实现的,他们的理论是光线进入人的眼睛才能引起视觉,如果有隐身衣存在,则其中的人由于没有光线进入眼中也就看不见外面的情况.但是后来横空出世的<宝典>里却详细叙述了数种隐身衣的实现原理并成功地将之实现.

java中,一个简单但出错率又大的‘加法’题,1+1+&#39;1&#39;+1+1+1+1+&quot;1&quot;=?

1+1+'1'+1+1+1+1+"1"=? 结果是多少?很多人看了题之后,可能会说结果是71.  当然有的童鞋可能会说很简单,放工具里运行一下就知道结果了,如果不运行代码,你会得出一个什么样的结果呢? 如果告诉你答案是551,会迷惑么?怎么会得出551? 下面我们来看看怎么算的: 1.我们大家都知道1 .'1'."1"的区别,1 表示一个int类型,’1'是表示一个char类型,"1" 表示一个字符串类型. 2.1+1+'1'+1+1+1+1+&

3116 高精度练习之加法

3116 高精度练习之加法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出两个正整数A和B,计算A+B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Output Description 输出A+B的值 样例输入 Sample Input 3 12 样例输出 Sample Output 15 数据范围及提示 Data Size & Hint

0.28+0.34=? 一个简单小数加法引发的思考

0.28+0.34=? 我相信这个简单的加法,谁都会,肯定等于0.62嘛. 这是两个特别简单的加法,那如果我在其整数位置上加上其他的数字,或者多加几个和项,你是否还能快速算过来? 我想这时候,我们又得借助计算器了!而这,有时可能就是电脑!尤其是如果咱们借助简单程序语言来算的时候,嘿嘿,可能就不是那么回事了~ 不信你看,用javascript算的结果: 用python算的结果: 当然了,我尝试着用其他语言来试一下,结果好像并不都是这样. 其中,java只会在类型转换的时候出现奇怪的值:(当然这在我

中石油出售千亿资产背后暗藏啥玄机?

继三月份,两大石油巨头之一的中石化提出规模庞大的销售业务"混改"计划后,5月12日,中国石油天然气股份有限公司(中石油集团旗下上市公司,下称"中石油")发布公告:将设立东部管道公司,并通过产权交易所公开转让东部管道公司100%股权. 即将设立的东部管道公司,主要出资为西气东输管道分公司管理的与西气东输一.二线相关的资产及负债,以及管道建设项目经理部核算的与西气东输二线相关的资产及负债.这也就是说,中石油股份将彻底出售西气东输一线.二线. 在本次公告中,中石油股份语焉