大整数加法

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


首先要解决的就是存储多位整数的问题.显然,任何C/C++固有类型的变量都无法保存它.最直观的想法是可以用一个字符串来保存它.字符串本质上就是一个字符数组.然后依次从低位到高位进行运算,相加结果大于9即进位.
完整代码:

/******************************************
/*    杭电ACM1002:A + B Problem II
/*    2010/10/1
/*    VC 6.0  by 52coder
/*    persever2009@gmail.com
******************************************/
#include <iostream>
using namespace std;
 
string Sum_calc(string s1,string s2)
{
    int length;
    //比较s1,s2的长度
    if (s1.length()>=s2.length())
    {
        length=s1.length();
        string tmp(s1.length()-s2.length(),'0');
        s2=tmp+s2;
    }
    else
    {
        length=s2.length();
        string tmp(s2.length()-s1.length(),'0');
        s1=tmp+s1;
    }
    string sum(length,'0');
    //carry 进位标志位
    int carry = 0;
    for (int k=length-1;k!=-1;--k)
    {
        //字符'0'对应ASCII码为48
        sum[k]=(s1[k]+s2[k]+carry-96)%10+48;
        carry=(s1[k]+s2[k]+carry-96>9);
    }
    //最高位进位后,进位处理
    if (carry)
        sum='1'+sum;
 
    return sum;
 
}
 
void main()
{
    int T;    //The number of test cases;
    cin>>T;
   //use the dynamic array when not knowing the dimension before compiling;
    string *A = new string[T];
    string *B = new string[T];
    string *Sum = new string[T];
    for (int i=0; i!=T; ++i)
    {
        cin>>A[i]>>B[i];
        Sum[i] = Sum_calc(A[i], B[i]);
    }
    for (int j=0; j!=T; ++j)
   {
    cout<<"Case "<<j+1<<":"<<endl<<A[j]<<" + "<<B[j]<<" = "<<Sum[j];
    if(i!=T-1)
    cout<<endl;
   }


文章出自:我爱程序员 http://www.52coder.net/archives/1055.html 版权所有.本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出。 【基本要求】 1.要求采用链表来实现大整数的存储和运算,不允许使用标准模板类的链表类(list)和函数。 同时要求可以从键盘输入大整数,也可以文件输入大整数大整数可以输出至显示器,也可以输出至文件。大整数的存储、运算和显示,可以同时支持二进制和十进制,但至少要支持十进制。大整数输出显示时,必须能清楚地表达出整数的位数。测试时,各种情况都需要测试,并附上测试截图;要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详细易懂,表明各个功能的执行正确。 2.要求大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为十几位的整数,也可以为500多位的整数,甚至更长;大整数的运算和显示时,只需要考虑正的大整数。如果可能的话,请以秒为单位显示每次大整数运算的时间。 3.要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。 4.要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。 5.不强制要求采用类模板,也不要求采用可视化窗口;要求源程序中有相应注释。 6.要求采用Visual C++ 6.0及以上版本进行调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值