• 【杭电】[2057]A + B Again


    这里写图片描述
    这里写图片描述

    做题过程有点变态的一题

    首先
    这一题是可以用自带的十六进制转化计算几句话就写出来的
    不过鉴于以为是大数
    所以起初选择了以字符串模拟
    (经过测试用时大概比直接写短五分之一)

    于是……先放代码

    #include<stdio.h>
    #include<string.h>
    char s[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    char s1[20],s2[20];
    int l1,l2;
    int find(char c) {
        int i=0;
        while(s[i]!=c)
            i++;
        return i;
    }
    int vs() {
        if(l1==l2)
            return strcmp(s1,s2);
        else {
            if(l1>l2)
                return 1;
            else
                return -1;
        }
    }
    int main() {
    //  freopen("input.txt","r",stdin);
    //  freopen("output.txt","w",stdout);
        int a[20],b[20],sum[20];
        while(scanf("%s %s",s1,s2)!=EOF) {
            char c1='+',c2='+';
            l1=strlen(s1),l2=strlen(s2);
            if(s1[0]=='+') {
                for(int i=0; i<l1-1; i++) {
                    s1[i]=s1[i+1];
                }
                l1--;
            }
            if(s1[0]=='-') {
                c1='-';
                for(int i=0; i<l1-1; i++) {
                    s1[i]=s1[i+1];
                }
                l1--;
            }
            if(s2[0]=='+') {
                for(int i=0; i<l2-1; i++) {
                    s2[i]=s2[i+1];
                }
                l2--;
            }
            if(s2[0]=='-') {
                c2='-';
                for(int i=0; i<l2-1; i++) {
                    s2[i]=s2[i+1];
                }
                l2--;
            }
            int t0=0;
            for(int i=0; i<l1; i++) {
                if(s1[i]=='0')
                    t0++;
                else
                    break;
            }
            if(t0)
                for(int i=0; i<l1-t0; i++) {
                    s1[i]=s1[i+t0];
                }
            l1-=t0;
            t0=0;
            for(int i=0; i<l2; i++) {
                if(s2[i]=='0')
                    t0++;
                else
                    break;
            }
            if(t0)
                for(int i=0; i<l2-t0; i++) {
                    s2[i]=s2[i+t0];
                }
            l2-=t0;
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            memset(sum,0,sizeof(sum));
            for(int i=0; i<l1; i++)
                a[i]=find(s1[l1-i-1]);
            for(int i=0; i<l2; i++)
                b[i]=find(s2[l2-i-1]);
            if(c1==c2) {
                int lmax;
                if(l1>l2)
                    lmax=l1;
                else
                    lmax=l2;
                for(int i=0; i<lmax; i++) {
                    if(sum[i]+a[i]+b[i]<16)
                        sum[i]+=a[i]+b[i];
                    else {
                        sum[i+1]=1;
                        sum[i]+=a[i]+b[i]-16;
                    }
                }
                if(sum[lmax]==1)
                    lmax++;
                if(lmax==0)
                    printf("0
    ");
                else {
                    if(c1=='-')
                        printf("%c",c1);
                    bool flag=false;
                    for(int i=lmax-1; i>=0; i--) {
                        if(s[sum[i]]!='0') {
                            printf("%c",s[sum[i]]);
                            flag=true;
                        } else {
                            if(flag)
                                printf("%c",s[sum[i]]);
                        }
                    }
                    printf("
    ");
                }
            } else {
                int tvs=vs();
                if(tvs==0)
                    printf("0
    ");
                else {
                    int lmax;
                    if(tvs>0) {
                        if(l1>l2)
                            lmax=l1;
                        else
                            lmax=l2;
                        for(int i=0; i<lmax; i++) {
                            if(a[i]-b[i]<0) {
                                a[i+1]--;
                                sum[i]=a[i]+16-b[i];
                            } else
                                sum[i]=a[i]-b[i];
                        }
                    } else {
                        if(l1>l2)
                            lmax=l1;
                        else
                            lmax=l2;
                        for(int i=0; i<lmax; i++) {
                            if(b[i]-a[i]<0) {
                                b[i+1]--;
                                sum[i]=b[i]+16-a[i];
                            } else
                                sum[i]=b[i]-a[i];
                        }
                    }
                    while(sum[lmax-1]==0&&lmax>0)
                        lmax--;
                    if(lmax==0)
                        printf("0
    ");
                    else {
                        if(tvs>0&&c1=='-')
                            printf("%c",c1);
                        else if(tvs<0&&c2=='-')
                            printf("%c",c2);
                        bool flag=false;
                        for(int i=lmax-1; i>=0; i--) {
                            if(s[sum[i]]!='0') {
                                printf("%c",s[sum[i]]);
                                flag=true;
                            } else {
                                if(flag)
                                    printf("%c",s[sum[i]]);
                            }
                        }
                        printf("
    ");
                    }
                }
            }
            memset(s1,0,sizeof(s1));
            memset(s2,0,sizeof(s2));
        }
        return 0;
    }
    

    大概思路明确之后
    其实写起来一点一点还好
    不过也是出现了大量的WA
    各种细节问题

    这个代码的亮点我觉得是以数组保存十六进制数字
    然后需要转化时直接依据这个数组就好了

    另外我觉得最大的收获是学会了自己进行数据测试
    放上一份自己写的生成输入数据代码

    #include<stdio.h>
    #include <windows.h>
    #include <time.h>
    char s[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int main() {
    //freopen("input.txt","r",stdin);
        freopen("input.txt","w",stdout);
        srand((unsigned)time(NULL));
        for(int T=0; T<100000; T++) {
            if(rand()%2)
                if(rand()%2)
                    printf("+");
                else
                    printf("-");
            int l;
            l=rand()%16+1;
            for(int i=0; i<l; i++)
                printf("%c",s[rand()%16]);
            printf(" ");
            if(rand()%2)
                if(rand()%2)
                    printf("+");
                else
                    printf("-");
            l=rand()%16+1;
            for(int i=0; i<l; i++)
                printf("%c",s[rand()%16]);
            printf("
    ");
        }
        return 0;
    }
    

    运行之后输入数据会保存成
    input.txt

    然后在自己的代码里加入

    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    

    然后便可以从input.txt读取数据
    输出到output.txt
    配合标程输出的数据及文本对比软件(我用的TextDiff)
    便可以快速的找出错误了

    PS:上传时记得删除测试的那两句
    否则会WA
    (在下刚开始就是忘了删了)

    总之不考虑其它的话
    这一题还是收获颇丰的

    题目地址:【杭电】[2057]A + B Again

  • 相关阅读:
    爬虫之爬取淘宝主题市场主要产品信息
    Linux内核11-定时器和时间管理
    UNIX8-进程控制
    UNIX7-进程环境
    Unix3-文件I/O接口
    Linux进程-打开的文件
    递归与二叉树_leetcode230
    递归与二叉树_leetcode235
    递归与二叉树_leetcode226
    递归与二叉树_leetcode222
  • 原文地址:https://www.cnblogs.com/BoilTask/p/12569672.html
Copyright © 2020-2023  润新知