码迷,mamicode.com
首页 > 其他好文 > 详细

ACM1753大明A+B

时间:2014-08-02 23:12:14      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   数据   for   

ACM1753_link

这道题利用了大数相加,但是需要将小数和整数部分分开,独立相加,然后组合成一个数;

数据的可能性:

1.两个整数相加,没有小数点

2.一个整数一个小数相加

3.两个小数相加

要对上面三种可能性进行分别处理

两个整数相加:存放在数组partone[N],parttwo[N]中,将答案存放在result数组中,用下面代码就可以完成

1 int t=0;
2     for(int i=0;i<maxn;i++)
3     {
4         t=partone[i]+parttwo[i]+t;//整数在数组里逆序排放,方便进位 
5         resultone[i]=t%10;
6         t=t/10;
7     }

一个整数和一个小数相加,然后小数部分的字符串子串不需要加法处理,将小数部分取出判断里面是否全为零并且把字符串后面的零全部去掉就可以了,然后只进行整数部分相加,按照上面的过程进行就行

两个小数相加,将整数部分和小数部分都取出分别存放到四个数组中,然后进行小数相加和整数相加,然后判断组合就可以了。

以下为全部代码:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=410;
bool flag;
int partone[maxn],parttwo[maxn],partthree[maxn],partfour[maxn];
int resultone[maxn],resulttwo[maxn];
//第一个数的整数部分 ,第二个数的整数部分,第一个数的小数部分,第二个数的小数部分
//整数部分的计算结果,小数部分的计算结果 
void init()//初始化各数组 
{
    flag=false;//如果是两个小数,标记是否会出现小数相加进位到个位的情况 
    memset(partone,0,sizeof(partone));
    memset(parttwo,0,sizeof(parttwo));
    memset(partthree,0,sizeof(partthree));
    memset(partfour,0,sizeof(partfour));
    memset(resultone,0,sizeof(resultone));
    memset(resulttwo,0,sizeof(resulttwo));
}
void ForResultone()//partone and parttwo
{
    int t=0;
    for(int i=0;i<maxn;i++)
    {
        t=partone[i]+parttwo[i]+t;//整数在数组里逆序排放,方便进位 
        resultone[i]=t%10;
        t=t/10;
    }
}
void ForResulttwo()//partthree and partfour
{
    int t=0;
    for(int i=maxn-1;i>=0;i--)
    {
        t=partfour[i]+partthree[i]+t;//小数部分在数组里是正序排放,从最后一个元素开始相加 
        resulttwo[i]=t%10;
        t=t/10;
    }
    if(t>0)//小数部分相加进位到个位的情况 
    flag=true;
}
void invert(char *s)
{
    int len=strlen(s);
    char c;
    for(int i=0;i<len/2;i++)
    {
        c=s[i];
        s[i]=s[len-i-1];
        s[len-i-1]=c;
    }
}
int main()
{
    char parts[maxn],parti[maxn];
    while(scanf("%s %s",parts,parti)!=EOF)
    {
        init();
        //if there are two integers
        if(strchr(parts,.)==NULL&&strchr(parti,.)==NULL)
        {
            int temp=strlen(parts);
            for(int i=temp-1;i>=0;i--)
            {
                partone[temp-i-1]=parts[i]-0;
            }
            int temp2=strlen(parti);
            for(int i=temp2-1;i>=0;i--)
            {
                parttwo[temp2-i-1]=parti[i]-0;
            }
            //上面分别把两个字符串中的整数存放到数组中,然后再下面的函数中相加 
            ForResultone();
            int re=0;
            for(int i=maxn-1;i>=0;i--)//把相加得到的结果的前面的零全部去掉 
                if(resultone[i])
                {
                    re=i;
                    break;
                }
            for(;re>=0;re--)
            {
                printf("%d",resultone[re]);
            }
            printf("\n");
            continue;
        }
        //if one of them is integer while another is float number
        else if(strchr(parts,.)==NULL||strchr(parti,.)==NULL)
        {
            char *re1,*re2;//re1 has the point
            //让re1代表有小数的字符串,re2代表整数字符串 
            if(strchr(parts,.)!=NULL)
            {
                re1=parts;
                re2=parti;
            }
            else 
            {
                re1=parti;
                re2=parts;
            }
            char *last=strchr(re1,.);last++;//用last标记小数部分的字符串 
            int ll=strlen(last);ll--;
            while(ll>=0&&last[ll]==0)
            {
                ll--;
            }//去掉小数部分后面所有的零 ,如果全是零ll会小于零 
            int lre=strlen(re1);
            lre--;
            while(re1[lre]!=.)//找整个字符串中小数点的位置 
            {
                lre--;
            }
            lre--;
            for(int i=0;lre>=0;lre--,i++)//将re1的整数部分存放到数组中 
            {
                partone[i]=re1[lre]-0;
            }
            int lre2=strlen(re2);lre2--;
            for(int i=0;lre2>=0;lre2--,i++ )//将re2存放到数组中 
            {
                parttwo[i]=re2[lre2]-0;
            }
            ForResultone();
            int re=0;
            for(int i=maxn-1;i>=0;i--)
                if(resultone[i])
                {
                    re=i;
                    break;
                }
            for(;re>=0;re--)
            {
                printf("%d",resultone[re]);
            }
            if(ll>=0)
            {
                printf(".");
                for(int i=0;i<=ll;i++)
                printf("%c",last[i]);
            }
            printf("\n");
            continue;
        }
        //two float numbers 
        char *last1=strchr(parts,.);last1++;//取小数部分 
        char *last2=strchr(parti,.);last2++;
        int len1=strlen(parts);len1--;
        int len2=strlen(parti);len2--;
        int len3=strlen(last1);
        int len4=strlen(last2);
        for(int i=0;i<len3;i++)
        partthree[i]=last1[i]-0;
        for(int i=0;i<len4;i++)
        partfour[i]=last2[i]-0;//把小数部分存放到数组中 
        ForResulttwo();
        int sign=maxn-1;
        while(sign>=0&&resulttwo[sign]==0)//去掉小数部分相加后后面的零,如果全为零sign小于零 
        sign--;
        int for1=len1-len3-1;//取整数部分的长度 
        int for2=len2-len4-1;
        for(int i=0;for1>=0;for1--,i++)
                partone[i]=parts[for1]-0;
        for(int i=0;for2>=0;for2--,i++)
                parttwo[i]=parti[for2]-0;
        if(flag)partone[0]+=1;//如果小数部分相加后进位 
        ForResultone();
        int re=0;
        for(int i=maxn-1;i>=0;i--)
            if(resultone[i])
            {
                re=i;
                break;
            }
        for(;re>=0;re--)
        {
            printf("%d",resultone[re]);
        }
        if(sign>=0)//如果有小数部分 
        {
            printf(".");
            for(int i=0;i<=sign;i++)
            printf("%d",resulttwo[i]);
        }
        printf("\n");
    }
    return 0;
}

这个题目是足够的麻烦,思路要清晰,耐心要足够。

 

ACM1753大明A+B,布布扣,bubuko.com

ACM1753大明A+B

标签:style   blog   http   color   os   io   数据   for   

原文地址:http://www.cnblogs.com/sytu/p/3887486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!