必威体育Betway必威体育官网
当前位置:首页 > IT技术

杭电1002题,大数加法问题C++版

时间:2019-10-08 10:11:09来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

数字杭电

杭电1002题,大数加法典型问题,这道题怎么说呢,说难不难,但要注意一些细节。

先说一下解大数加法解题的思路,给你两个超长的数,首先,你可以用两个字符串a,b来保存,计算字符串的长度,然后将字符串中的每个字符转化为数字逆序保存到int型数组c,d中,然后两数组相加保存到一个新数组e中即可,进位的话就e[i+1]++即可。

举个例子:

比如算789 + 456.首先用两个字符串a,b分别保存好。然后计算他们的长度len1,len2,接着建立两个int型数组c,d长度分别为len1,len2即可。因为加法要从个位开始,为了方便计算我们需要将每个字符逆序保存到c,d中,即c[0]=9,c[1]=8,c[2]=7, d[0]=6,d[1]=5,d[2]=4. 然后将两数组相加保存到一个新数组e中,

e数组要先初始化为0(这点很重要!!!!).

e数组长度可以设置为len(  len=max(len1,len2)+1 ),len=4, 这样我们就可以开始加了,e[0]=c[0]+d[0]=15大于10了,我们让e[0]对10取模即可,即e[0]%=10,这样e[0]=5,  有进位,因为e数组已经初始化为0,那么e[0+1]++即可,即e[1]变成1了,如果是第i个数,e[i+1]++即可。e[1]=(e[1]+c[1]+d[1])%10即 e[1]=(1+8+5)%10=4, 依此类推e[2]=2, e[3]=1,逆序输出e数组即得到我们的结果1245.

博主刚开始只把核心算法写了,然后一提交就ERROR,我心想,我核心算法应该对啊,怎么老error呢,error几次以后发现是没有把字符串逆序保存到c,d数组中导致的。本以为到这就完事了,改完程序后一提交,神马!?presentation error,好吧,我要哭了有木有, 难受wuwuwu......  

又仔细看了一下输出格式要求,发现我多输出了一个回车,改完后终于ac。瞬间很兴奋有木有~~~~~~~

嗯,就写到这吧,最后代码如下:

觉得有用记得顶一下哦~~~

#include <iOStream>
#include <string.h>
#define N 1010
using namespace std;
void print(int a[], int len)
{
    //判断a[len]是否为0,为0表示两数相加不进位,不为0则表示进位了
        if(a[len])
        {
            for(int i=len; i>=0; i--)//不进位
              cout<<a[i];
        }
        else
        {
            for(int i=len-1; i>=0; i--)//进位
              cout<<a[i];
        }
        cout<<endl;
}
int main()
{
    int T=0;
    cin>>T;
    int countt=0;//计数器,每输出一次加1
    while(T--)
    {

        string a,b;
        int c[N],d[N],e[N];
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        memset(e,0,sizeof(e));//此处e数组必须初始化为0
        cin>>a>>b;

        int len1=a.length(),len2=b.length();
        int len=max(len1,len2);//用len保存len1 len2中较长的那个

        for(int i=len1-1,j=0; i>=0; i--,j++)//将字符串a转化为数字并逆序保存到c数组中
        {
            c[j]=a[i]-'0';
        }
        for(int i=len2-1,j=0; i>=0; i--,j++)//将字符串b转化为数字并逆序保存到d数组中
        {
            d[j]=b[i]-'0';
        }

        for(int i=0; i<len+1; i++)
        //c,d两数组相加保存到e中,e的长度应该是小于等于a,b字符串中较长的那个+1的,即len+1
        {
            e[i]=e[i]+c[i]+d[i];//e数组初始化为0方便此处相加哦QAQ,我就是在这错了,刚开始没加e[i]
            if(e[i]>9)
            {
                e[i]%=10;
                e[i+1]++;
            }
        }

        //输出格式问题,该加的空格要加上不该加的回车不要加,否则会出现presentation错误
        cout<<"Case "<<++countt<<":"<<endl;
        cout<<a<<" + "<<b<<" = ";
        print(e,len);//逆序输出e数组

        if(T>0)//判断是否需要多加空行
        cout<<endl;
    }

    return 0;
}

相关阅读

InputStreamReader 出现乱码问题如何解决?

File file=new File("hello.txt"); if(file.exists()){ System.out.println("exit"); System.out.println(); try {

C语言常见面试题

面试题>>C 语言 1.请写出 : bool, float, *p 与零值比较的 if 语句bool flag : if(flag) if(!flag) float x : const float EXP

GearmanManager安装及碰到的问题

gearman manager安装的时候由于官方文档不太全,转了几大圈才搞定现在记录下来安装前需要php安装pecntlphp -m|grep pcntl 命令

宝贝标题最好多少分

今天小编给大家带来的是“宝贝标题最好多少分”这一问题的相关解析。现在在淘宝开店的店主越来越多,宝贝标题评分也成为一个宝贝好

【思考题】新客老客定义

一、问题 数据分析的两层模型中,第一层就是对分析对象做细分,然后第二层看指标异动。 针对用户的分析中,最常见的细分方式是做“新客

分享到:

栏目导航

推荐阅读

热门阅读