杭电ACM(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 follow, each line consists of two positive integers, A and B. Notice that the integers are very large,
 that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.

Output
For each test case, you should output two lines. The first line is "Case #:", 
# means the number of the test case. The second line is the an equation "A + B = Sum",
Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.

Sample Input
2
1 2
112233445566778899 998877665544332211

Sample Output
Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

/*
大数相加----格式完全正确版
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 follow, each line consists of two positive integers, A and B. Notice that the integers are very large,
 that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.

Output
For each test case, you should output two lines. The first line is "Case #:",
# means the number of the test case. The second line is the an equation "A + B = Sum",
Sum means the result of A + B. Note there are some spaces int the equation. Output a blank line between two test cases.

Sample Input
2
1 2
112233445566778899 998877665544332211

Sample Output
Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

分析,因为两数都超过了整型数的表数范围,因此在处理时,用字符数组分别来存放两个大数
然后再处理。处理时,要将数字字符和对应数字进行转换,并要考虑对应位上求和有进位的情况。

处理时要考虑几种情况
(1) 1+223 (串长度不同,不产生最高位进位)
(2) 223+1
(3) 111+222 (串长度相同,但不产生最高位进位)
(4) 1+999 (串长度不同,产生最高位进位)
(5) 999+1
(6) 199+1 (串长度不同,但不产生最高位进位)
(7) 1+199
(8) 999+222  (串长度相同,但产生最高位进位)

因此求和的数组长度一定要比两个串中较长的那个串长多1,因为要存放最高位进位

一种方法可以利用第3个数组,但为了节省空间,我们可以用第二个数组来存放求和结果
因为我们是从第二个串的最后一个位置再往后一个位置开始存放,
所以在依次求和中并不能影响还没用到的位上的数字

*/
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
 ];  //存放第一个字符串
 ];  //存放第二个字符串,并存放两个串的和
 int case_N;   //存放case个数
 int length_a;  //获取第一个串的长度
 int length_b;  //获取第二个串的长度
 char *p_a;  //指向第一个串的指针
 char *p_b;  //指向第二个串的指针
 char *p_s;  //指向第二个串的指针,存放结果
 int sum;  //存放两个数对应位上的两个数字之和
 ; //存放下一次计算是否有上次的进位
 int i; //循环控制变量
 cin>>case_N;
 ;i<=case_N;i++)  //用循环完成case_N次两个大数相加
 {
      flag=;
      cout<<"Case "<<i<<":"<<endl;
      cin>>a>>b;
      length_a=strlen(a);  //获取第一个串的长度
      length_b=strlen(b);  //获取第二个串的长度
      p_a=a+length_a-;  //指针指向第一个串的最后
      p_b=b+length_b-;   //指针指向第二个串的最后
      cout<<a<<" + "<<b<<" = ";
      p_s=b+(length_a>length_b?length_a:length_b)+;  //指针指向第二个串的最后再往后两个位置,用来指向要存放的和(和要比连个两个串中的较长的那个串还多1个,因为存在进位)
      *p_s='\0';  //最后一个位置放字符串结束标记
      p_s--;  //p_s前移
      //计算求和,从各自的个位往前递增相加
      while(p_a>=a&&p_b>=b) //如果两个串对应的指针都没有到各自串的第一个位置
      {
          sum=*p_a-'+flag;  //因为是字符数组,因此要进行字符对应数字的转换,并且要加上上一次相加的进位flag(0或1)
        )  //对应位上数字和大于10则存在进位
        { flag=;  //进位1
          *p_s=sum-+'; //对应位上和减10获取对应位上数字,再转换为对应数字字符存放到数组中
        }
        else
        {
         flag=; //不进位0
         *p_s=sum+';
        }
       p_a--;
       p_b--;
       p_s--;
     }

     ) //如果第一个串中数字从地位到高位都加完了
     {
          while(p_b>=b)  //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
        {
         sum=*p_b-'+flag;
         )
         { flag=;
           *p_s=sum-+';
         }
         else
         {
          flag=;
          *p_s=sum+';
         }
         p_b--;
         p_s--;
        }
     }
     else //如果第二个串中数字从地位到高位都加完了
     {
       while(p_a>=a)  //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
        {
         sum=*p_a-'+flag;
         )
         { flag=;
           *p_s=sum-+';
         }
         else
         {
          flag=;
          *p_s=sum+';
         }
         p_a--;
         p_s--;
        }
     }

    )  //如果最后一次相加无进位
       cout<<p_s+; //从第二个数组中的第二个位置开始输出,即为求和结果
    else  //如果最后一次相加有进位,则把进位1,存放到第二个数组中的第一个位置
    {
       *p_s='; //则把进位'1',存放到第二个数组中的第一个位置
       cout<<p_s; //从第二个数组中的第一个位置开始输出,,即为求和结果
    }
    if(i==case_N)
       cout<<endl;
    else
       cout<<endl<<endl;  //两个case之间有空行隔开

 }
 ;
}

以下程序是就完成一次两个大数相加

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
 ];  //存放第一个字符串
 ];  //存放第二个字符串,并存放两个串的和

 int sum;  //存放两个数对应位上的两个数字之和
 ; //存放下一次计算是否有上次的进位
 cin>>a>>b;
 int length_a=strlen(a);  //获取第一个串的长度
 int length_b=strlen(b);  //获取第二个串的长度
 ;  //指针指向第一个串的最后
 ;   //指针指向第二个串的最后
 cout<<a<<" + "<<b<<" = ";
 ;  //指针指向第二个串的最后再往后两个位置,用来指向要存放的和(和要比连个两个串中的较长的那个串还多1个,因为存在进位)
 *p_s='\0';  //最后一个位置放字符串结束标记
 p_s--;  //p_s前移
 //计算求和,从各自的个位往前递增相加
 while(p_a>=a&&p_b>=b) //如果两个串对应的指针都没有到各自串的第一个位置
 {
      sum=*p_a-'+flag;  //因为是字符数组,因此要进行字符对应数字的转换,并且要加上上一次相加的进位flag(0或1)
    )  //对应位上数字和大于10则存在进位
    { flag=;  //进位1
      *p_s=sum-+'; //对应位上和减10获取对应位上数字,再转换为对应数字字符存放到数组中
    }
    else
    {
     flag=; //不进位0
     *p_s=sum+';
    }
   p_a--;
   p_b--;
   p_s--;
 }

 ) //如果第一个串中数字从地位到高位都加完了
 {
      while(p_b>=b)  //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
    {
     sum=*p_b-'+flag;
     )
     { flag=;
       *p_s=sum-+';
     }
     else
     {
      flag=;
      *p_s=sum+';
     }
     p_b--;
     p_s--;
    }
 }
 else //如果第二个串中数字从地位到高位都加完了
 {
   while(p_a>=a)  //则循环加第二个串中剩下没加的数字,加到字符串的第一个数字字符
    {
     sum=*p_a-'+flag;
     )
     { flag=;
       *p_s=sum-+';
     }
     else
     {
      flag=;
      *p_s=sum+';
     }
     p_a--;
     p_s--;
    }
 }

)  //如果最后一次相加无进位
   cout<<p_s+<<endl; //从第二个数组中的第二个位置开始输出,即为求和结果
else  //如果最后一次相加有进位,则把进位1,存放到第二个数组中的第一个位置
{
   *p_s='; //则把进位'1',存放到第二个数组中的第一个位置
   cout<<p_s<<endl; //从第二个数组中的第一个位置开始输出,,即为求和结果
}

 ;
}

以下程序用了三个数组实现一次两个大数相加

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
 ];
 ];
 ]={'\0'};
 int sum;
 ;
 cin>>a>>b;
 cout<<a<<" + "<<b<<" = ";
 int length_a=strlen(a);
 int length_b=strlen(b);
 ;
 ;
 char *p_s=s+(length_a>length_b?length_a:length_b);
 while(p_a>=a&&p_b>=b)
 {
      sum=*p_a-'+flag;
    )
    { flag=;
      *p_s=sum-+';
    }
    else
    {
     flag=;
     *p_s=sum+';
    }
   p_a--;
   p_b--;
   p_s--;
 }

 )
 {
      )
    {
     sum=*p_b-'+flag;
     )
     { flag=;
       *p_s=sum-+';
     }
     else
     {
      flag=;
      *p_s=sum+';
     }
     p_b--;
     p_s--;
    }
 }
 else
 {
   )
    {
     sum=*p_a-'+flag;
     )
     { flag=;
       *p_s=sum-+';
     }
     else
     {
      flag=;
      *p_s=sum+';
     }
     p_a--;
     p_s--;
    }
 }

)
   cout<<p_s+<<endl;
else
{
   *p_s=';
   cout<<p_s<<endl;
}

 ;
}

杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过的更多相关文章

  1. 杭电acm 1002 大数模板(一)

    从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...

  2. 杭电ACM 1002题

    import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(S ...

  3. 杭电ACM刷题(1):1002,A + B Problem II 标签: acmc语言 2017-05-07 15:35 139人阅读 评

    最近忙于考试复习,没有多少可供自己安排的时间,所以我利用复习之余的空闲时间去刷刷杭电acm的题目,也当对自己编程能力的锻炼吧. Problem Description I have a very si ...

  4. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  5. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  6. HDU 1002 A + B Problem II(高精度加法(C++/Java))

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  8. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  9. 抓起根本(二)(hdu 4554 叛逆的小明 hdu 1002 A + B Problem II,数字的转化(反转),大数的加法......)

    数字的反转: 就是将数字倒着存下来而已.(*^__^*) 嘻嘻…… 大致思路:将数字一位一位取出来,存在一个数组里面,然后再将其变成数字,输出. 详见代码. while (a) //将每位数字取出来, ...

随机推荐

  1. CSS笔记——padding,margin为百分比计算时的参照对象

    div的padding为百分比的两种情况 padding-top,padding-bottom,margin-top,margin-bottom是百分比时是按照当前元素的父级元素的宽度来计算的 1. ...

  2. spring读取prperties配置文件(2)

    接上篇,spring读取prperties配置文件(1),这一篇主要讲述spring如何用annotation的方式去读取自定义的配置文件. 这里我先定义好属性文件"user.propert ...

  3. 暑假集训(5)第二弹———湫湫系列故事——减肥记I(hdu4508)

    问题描述:舔了舔嘴上的油渍,你陷在身后柔软的靠椅上.在德源大赛中获得优胜的你,迫不及待地赶到“吃到饱”饭店吃到饱.当你 正准备离开时,服务员叫住了你,“先生,您还没有吃完你所点的酒菜.”指着你桌上的一 ...

  4. c语言与c++基础知识

    1.后缀名: C++/C程序的头文件以.h为后缀,C程序的源文件以.c为后缀,C++程序的源文件通常以.cpp为后缀(有些书中介绍有一些系统以.cc或.cxx为后缀的源文件).在Linux系统下的gc ...

  5. opencv 手写选择题阅卷 (一)表格设计与识别

    (一)答题表格设计与识别 实际设计好的表格如下图 为了图像精确,表格和四角的标记都是由程序生成的,文字和数据是后期排版软件添加上去的. 图中四角的四个黑方块主要用来定位表格,然后就可以切割出每个单元格 ...

  6. C#快速学习笔记(译)续一

    6.虚拟和非虚拟函数 下面是一个非虚拟函数 using System; namespace Test2 { class Plane { public double TopSpeed() {return ...

  7. Xen学习——原理要点归纳总结

    Xen是半虚拟化,需要修改操作系统内核.Vmware是完全虚拟化. XEN的系统架构: Xen Hypervisor: 直接运行在硬件上,介于操作系统和硬件之间的一层软件,负责管理CPU.内存.中断. ...

  8. fedora -- java多版本切换

    一般java开发时会下载多个版本的SDK,所以需要多个版本中进行切换 1. 设置JAVA_HOME环境变量需要打开.bashrc文件 2. 安装时使用alternatives将不同版本的java连接到 ...

  9. ubuntu find方法

    通用格式:find pathname -options [-print -exec -ok]例子:find / -name filename 再根目录里面搜索文件名为filename的文件find / ...

  10. js时间格式的转换

    function System_dateInit(value) {     if (value != null) {         var d = new Date(value);          ...