【hdoj 1002】大数加法

题目:传送门

解答:大数(范围超过可表示精度)加法,C++没有java的相应的大数类,直接用字符串模拟。几个小trick:

  1. 考虑两个数的长度,可以刚刚开始就将两者顺序调换(加法交换律),使得第一个为更长的数;
  2. 字符转换成数字:number = s - ‘0‘;
  3. 数字转换成字符:s = (char)(number + ‘0‘);
  4. 一开始不清楚结果是几位数,可以先倒序模拟,最后再倒序还原。
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

using namespace std;

int main()
{
    int t;
    cin>>t;
    string pa, pb, a, b, c, tmp;
    vector<char> save;
    int jinwei, sum;

    for (int k = 0; k < t; k++)
    {
        cin>>pa>>pb;
        save.clear();
        c.clear();

        // 重置顺序!但是保留原先的数值
        if(pa.size() < pb.size())
        {
            a = pb;
            b = pa;
        }
        else
        {
            a = pa;
            b = pb;
        }

        int maxlen = a.size();
        int minlen = b.size();

        sum = 0;
        jinwei = 0;
        int i = maxlen;
        int j = minlen;
        while((i--) && (j--))
        {
            sum = a[i] - '0' + b[j] - '0';
            if(jinwei) sum++;
            if(sum > 9)
            {
                jinwei = 1;
            }
            else
            {
                jinwei = 0;
            }
            save.push_back((char)(sum % 10 + '0'));
        }

        /*if ((maxlen - minlen) != 0)
        {*/
            for (i = (maxlen - minlen - 1); i >= 0 ; i--)
            {
                sum = a[i] - '0';
                if(jinwei) sum++;
                if(sum > 9)
                {
                    jinwei = 1;
                }
                else
                {
                    jinwei = 0;
                }
                save.push_back((char)(sum % 10 + '0'));
            }
        //}

        if(jinwei)
        {
            save.push_back('1');
        }

        for (int i = save.size() - 1; i>=0 ; i--)
        {
            c = c + save[i];
        }

        printf("Case %d:\n", k+1);
        cout<<pa<<" + "<<pb<<" = "<<c<<endl;
        if (k != t - 1)
        {
            cout<<endl;
        }
    }

    return 0;
}
时间: 2024-07-30 12:51:16

【hdoj 1002】大数加法的相关文章

POJ 1053 Integer Inquiry &amp;&amp; HDOJ 1047 Integer Inquiry (大数加法)

题目链接(POJ):http://poj.org/problem?id=1503 题目链接(HDOJ):http://acm.hdu.edu.cn/showproblem.php?pid=1047 Integer Inquiry Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30856   Accepted: 12007 Description One of the first users of BIT's new su

题解报告:hdu 1002 A + B Problem II(大数加法)

Problem Description I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. Input The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines fol

A + B Problem II(大数加法)

一直格式错误,不想改了,没A 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 int main() 8 { 9 int T,K=0; 10 scanf("%d",&T); 11 char a[1002],b[1002]; 12 int ta[1002],

ACM~大数加法&amp;&amp;hdu题目样例

提出问题:为什么要提出大数的运算?(注java中有大数类,这里不再讲解,题目代码中略有java代码) 答案:因为计算机的数字类型是有限制的,例如int:2^32-1; long long 2^64-1;(以C++数据类型为例),因此在某些运算中需要高精度的运算,此时大数的模拟运算就应运而生了.这里只谈一下大数的加法,首先给出大整数的加法,再给出大实数的加法. 1.大整数加法的模拟,这里模拟小学生加法运算,用字符串储存大整数的数值. 首先看一下小学生的加法:987 + 345 = 1332 从个位

A + B Problem II(大数加法)

http://acm.hdu.edu.cn/showproblem.php?pid=1002 A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 261608    Accepted Submission(s): 50625 Problem Description I have a very simple p

C语言 &#183; 大数加法

算法提高 大数加法 时间限制:1.0s   内存限制:256.0MB 问题描述 输入两个正整数a,b,输出a+b的值. 输入格式 两行,第一行a,第二行b.a和b的长度均小于1000位. 输出格式 一行,a+b的值. 样例输入 42 样例输出 6 1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1001],b[1001]; 6 int s[1001],d[1001]; 7 scanf("

NI笔试——大数加法

NI笔试: 1.找出字符串第一次出现的字符.用数组建立哈希表,然后再扫描字符串并判断次数是否为1. 2.大数加法,即字符串加法.因为之前写过乘法,就以为是乘法.然后就把乘法写上去了····= = 好了,看一下加法的思路. 要不要太简单,用俩数组,先把字符串每个位转换成数字存到这俩数组里,然后对每一位进行加和. 代码是拿别人的.= = void Add(char s1[],char s2[]) //需要两个字符串参数&&无返回值 { int num1[M],nm2[M]; int i,j;

大数加法、乘法

1 #include<iostream> 2 3 #include<stdio.h> 4 5 #include<string.h> 6 7 #define Len 3000//大数的长度 8 9 using namespace std; 10 11 int Input (char n[])//将大数读入的函数 12 13 { 14 15 char s[Len]; 16 17 int i,l; 18 19 20 21 for(i=0; i<Len; i++) n[i

大数加法、减法、乘法

大数四则运算--C++实现 大数处理--c++实现 本课题来自我的c++编程作业,文章利用大数处理类,类名:hugeNumber来对大数(编译器自定义的数值类型无法处理的数)进行四则运算(大数加法.大数减法及大数乘法的运算,除暂时没实现)和按精度四舍五入,自定义科学计数法等.内容广泛涉及运算符重载.字符连接.字符加减和字符乘除等作者原创函数.重要提示:本文涉及的所有函数使用的进制皆为10进制.(备注:已将该博客搬迁至CSDN) 一.解题思路 1 核心思想 文章用hugeNumber类对大数进行操

HDOJ 1002 A + B Problem II (Big Numbers Addition)

题目链接在此?http://acm.hdu.edu.cn/showproblem.php?pid=1002 这题也比较简单,只需要开三个长度为1000的char数组来分别储存a.b.ans,再利用我们加法的算法,先向右对齐再相加.注意一下进位时的特殊情况就好了. 不过笔者的代码写好后提交上去,两次Presentation Error,然后才发现只是最后多输出一个空行的问题  =.= Orz /**  * HDOJ 1002 A + B Problem II  * Big Numbers Addi