ACM1753大明A+B

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

时间: 2024-10-20 13:01:01

ACM1753大明A+B的相关文章

TCP/IP之大明内阁---协议的制定

个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果,谢谢你们的分享. 本文源地址:TCP/IP之大明内阁 本文是<TCP/IP之大明王朝邮差>的前传,讲一讲大明内阁的各位大人是怎么设计TCP/IP网络的. 大明天启年间,明熹宗朱由校醉心于木工,重用宦官魏忠贤,不上朝已经很久了.内阁首辅叶大人忧心忡忡,大明各地民不聊生,大片田地荒芜,强盗.野兽横行.

TCP/IP 之 大明王朝邮差

本系列文章全部摘选自"码农翻身"公众号,仅供个人学习和分享之用.文章会给出原文的链接地址,希望不会涉及到版权问题. 个人感言:真正的知识是深入浅出的,码农翻身" 公共号将苦涩难懂的计算机知识,用形象有趣的生活中实例呈现给我们,让我们更好地理解.感谢"码农翻身" 公共号,感谢你们的成果,谢谢你们的分享. 本文源地址:http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513094&

【转载】TCP/IP 之 大明王朝邮差

原文:TCP/IP 之 大明王朝邮差 原创 2016-05-12 刘欣 码农翻身 前言: 本文主要想说一下TCP的知识, 比喻有不恰当之处,敬请包涵. 大明王朝天启四年, 清晨. 天色刚蒙蒙亮,我就赶着装满货物的马车来到了南城门, 这里是集中处理货物的地方 , 一队一队的马车都来到这里, 城头的士兵带着头盔,身披盔甲, 手持长枪, 虎视眈眈的注视这下面的动静. 城门口的大棚里乱哄哄的,是一群人围在一起赌钱, 这些家伙都穿着同样的衣服, 前胸和后背写着三个大字  “TCP邮差” 我知道这就是我要找

HDOJ 1753 大明A+B

JAVA大数.... 大明A+B Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7763    Accepted Submission(s): 2748 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫"大明". 这时他已经不是那个只会做100以内加法的那个&quo

【HDOJ】1753 大明A+B

注意数据格式,可以是整数,并且注意输出最简化浮点数. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 420 5 6 char a[MAXNUM], b[MAXNUM], c[MAXNUM], d[MAXNUM]; 7 int lena, lenb; 8 int posa, posb; 9 10 int addf(int bega, int begb, int *carry); 11 int addi(in

刘备找了4个人,建立了蜀国, 朱元璋找了8个人,建立了大明王朝

刘备找了4个人,建立了蜀国, 朱元璋找了8个人,建立了大明王朝: 太祖找到10个元帅,建立了新中国: 耶稣找了12个门徒,建立全球最大宗教之一的基督教: 马云找了18个人,建立了全球最大的电子商务帝国: 孔子找了72个门徒,建立儒家思想影响全世界! 群主找了我们几百号人建了个群.群主你出来解释解释,你准备带领我们往那个方向走?再问一句,2017年已经第十一天了,2016年的奖金哪天发?

大明宫、浐灞湿地公园

昨晚上临时决定和室友一起去市里,决定利用旅游年卡好好转转,想想竟然激动不已,晚上都睡不着觉. 早上七点半起的床,然后吃了早饭,虽然有两根油条,但是并不完美,竟然得到了相反的效果.昨晚上舍友计划是不去吃早餐的,但是,我按照他的说他,还是间接的实现了吃早餐的目的! 到了市里,我径直去了大明宫,大明宫很大.一个人转了很久.之后,直接去了浐灞湿地公园,公园里面人很少,一个静静的走着,听着悠扬的曲调,竟然有些莫名的感动!下午和是室友约好的去买衣服,虽然他没有买到衣服,但是我却买到一双鞋子.然后,两个人挤公

大明第一亲王陵明鲁王朱檀墓及出土瓷器

大明第一亲王陵――明鲁王朱檀墓及出土瓷器 济南 汪曦曦 鲁荒王朱檀是明洪武皇帝朱元璋第十子,为朱元璋与郭宁妃所生.史料记载朱檀生于洪武三年(1370年),出生两个月就被封为鲁王,洪武十八年就藩兖州.朱檀喜爱文学,谦恭下士,颇得朱元璋喜爱.但他同时痴迷长生不老之术,终日焚炉炼丹,日日吞服,结果"饵金石药,毒发伤目",导致双目失明,以至病入膏肓,不治身亡,时年仅18岁.朱元璋得知消息后,既恼怒,又悲伤,恼怒之余给了他一个恶谥――荒,因此朱檀谥号鲁荒王.朱檀死后,按照亲王礼制在今山东邹城城东

观《大明宫》纪录片后感

我之前很少认真地看历史,或许是理解力不够,或是因为兴趣不足.(四大名著看书或者电视剧,过了一遍或几遍,就觉得自己还挺懂的了.) 前不久,把<明朝那些事儿>看完了,现在的空闲时间又在看<万历十五年>,算是对历史的兴趣越来越浓厚了.通过当年明月和黄仁宇,我了解到,其实历史还是可以变得很有趣的,关键是谁在给你讲历史.我不可能自己拿本历史稿去研究. 回归主题,6级纪录片<大明宫>我是分两次看完的,该纪录片主要通过描写“大明宫”这一大唐政治中枢的诞生到毁灭的过程,来透视大唐的盛衰