3116 高精度练习之加法——http://codevs.cn/problem/3116/

第一部分:题目

题目描述 Description

给出两个正整数A和B,计算A+B的值。保证A和B的位数不超过500位。

输入描述 Input Description

读入两个用空格隔开的正整数

输出描述 Output Description

输出A+B的值

样例输入 Sample Input

3 12

样例输出 Sample Output

15

数据范围及提示 Data Size & Hint

两个正整数的位数不超过500位

第二部分:思路

由于数值比较大,所以用字符串形式接收。因为相加是从个位开始,所以可以从数组最后开始(这样需要判断哪个数长,稍微麻烦点)或者先把数组倒置在进行计算。这里使用的是后者。当两个数的长度不一样时需要把长的那个继续计算。在相加的过程中,需要判断是否需要进位,这里的flag变量其实就起到这个作用。

第三部分:代码

#include<stdio.h>
#include<string.h>
void repai(char s[500],int len)//把数组倒置 
{
    int i,j=len-1;
    char t;
    for(i=0;i<j;i++)
    {
        j=len-i-1;//相当于以中点对折。 
        t=s[i];
        s[i]=s[j];
        s[j]=t;
    }
}
int main()
{
    char a[500],b[500];//接收数a、b 
    int result[501],length=0,alen,blen;
    scanf("%s %s",a,b);
    alen=strlen(a);//数组a、b长度 
    blen=strlen(b);
    int i,j,flag=0;
    repai(a,alen);//倒置 
    repai(b,blen);
    int t;
    for(i=0;i<alen&&i<blen;i++)//从个位开始相加 
    {
        t=a[i]-'0'+b[i]-'0'+flag;
        if(t>9)//判断是否需要进位 
        {
            t-=10;
            flag=1;
        }
        else//这里稍微注意一下,当前不需要进位时置为0 
        {
            flag=0;
        }
        result[length++]=t;
    }
    while(i<alen)
    {
        t=a[i]-'0'+flag;
        if(t>9)
        {
            t-=10;
            flag=1;
        }
        else
        {
            flag=0;
        }
        result[length++]=t;
        i++;
    }
    while(i<blen)
    {
        t=b[i]-'0'+flag;
        if(t>9)
        {
            t-=10;
            flag=1;
        }
        else
        {
            flag=0;
        }
        result[length++]=t;
        i++;
    }
    if(flag)
    {
        result[length++]=1; 
    }
    for(i=length-1;i>=0;i--)
    {
        printf("%d",result[i]);
    }
    printf("\n");
    return 0;
}

 

posted @ 2016-04-11 19:04  喝醉的香锅锅  阅读(240)  评论(0编辑  收藏  举报