LETTers比赛第三场 --1003 大明A+B解题报告

报告人:侯建鹏

报告日期:2012/4/16

1003 大明A+B

解题思路:模拟

我的方法很简单,就是不停的模拟、模拟、再模拟。

首先,把每个数都分成两部分,整数部分和小数部分,即a_h_count、a_l_count、b_h_count、b_l_count。相信只要细心一些都可以做出来的。

然后,把模拟人工计算过程,先加小数位,加完之后,产生的对整数位的进位再和两个数的整数部分相加,最后把零去掉,输出就可以了。

关键是:一定要细心!!!

详见代码。

 

#include<stdio.h>
#include<string.h>
#define N 400+10

char a[N],b[N];
int a_h[N],a_l[N],b_h[N],b_l[N],h[N],l[N],h_count,l_count;

int Judge(char *a)
{
    int i=0;
    while(a[i]!='.'&&a[i]!=0)
        i++;
    return i;
}

int Change1(char *a,int *a_h,int a_point)
{
    int i,j=0;
    for(i=a_point-1;i>=0;i--)
    {
        a_h[j]=a[i]-'0';
        j++;
    }
    return j;
}
int Change2(char *a,int *a_l,int a_point )
{
    int i,j=0;
    if(a[a_point]==0)
        return 0;
    for(i=a_point+1;a[i]!=0;i++)
    {
        a_l[j]=a[i]-'0';
        j++;
    }
    return j;
}

int max(int a,int b)
{
    return a>b?a:b;
}

int main()
{
    int i;
    int a_point,b_point,a_h_count,b_h_count, a_l_count,b_l_count;
    while(scanf("%s%s",a,b)==2)
    {
        memset(a_h,0,sizeof(a_h));
        memset(b_h,0,sizeof(b_h));
        memset(a_l,0,sizeof(a_l));
        memset(b_l,0,sizeof(b_l));
        memset(h,0,sizeof(h));
        memset(l,0,sizeof(l));
        a_point=Judge(a);
        b_point=Judge(b);
        a_h_count=Change1(a,a_h,a_point);
        b_h_count=Change1(b,b_h,b_point);
        a_l_count=Change2(a,a_l,a_point);
        b_l_count=Change2(b,b_l,b_point);
        h_count=max(a_h_count,b_h_count);
        l_count=max(a_l_count,b_l_count);
        //printf("%d\n",a_l_count);
        //printf("%d\n",b_l_count);
        //printf("%d\n",l_count);
        for(i=l_count-1;i>=0;i--)
        {
            if(i==0)
            {
                l[i]+=a_l[i]+b_l[i];
                h[0]+=l[i]/10;
                l[i]=l[i]%10;
            }
            else
            {
                l[i]+=a_l[i]+b_l[i];
                l[i-1]+=l[i]/10;
                l[i]=l[i]%10;
            }
        }
        for(i=0;i<h_count;i++)
        {
            h[i]+=a_h[i]+b_h[i];
            h[i+1]+=h[i]/10;
            h[i]=h[i]%10;
        }
        if(h[h_count]!=0)
            h_count++;
        i=l_count-1;
        while(l[i]==0&&i>=0)
        {
            l_count--;
            i--;
        }
        i=h_count-1;
        while(h[i]==0&&i>=1)
        {
            h_count--;
            i--;
        }
        for(i=h_count-1;i>=0;i--)
            printf("%d",h[i]);
        if(l_count>0)
        {
            printf(".");
            for(i=0;i<l_count;i++)
                printf("%d",l[i]);
        }
        printf("\n");
        //printf("l_count=%d\n",l_count);
    }
    return 0;
}

 

posted @ 2012-04-16 21:41  LETTers  阅读(348)  评论(0编辑  收藏  举报