A + B Again

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2057

第一种方法:很普通,就是十六进制与十进制之间的转换,但要注意数的范围,开始用int ,然后又用long,就是完美避过了long long,

一个long long卡了我几天,好痛苦,但是当我知道第二种方法的时候更痛苦。本来几行的代码硬是让我写了100多行。其实本来就该适应这种被代码虐的感觉。*~*   *~*

#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
int pow(long x,long y)
{
    long m=1;
    for(long i=0; i<y; i++)
        m*=x;
    return(m);
}
int main()
{
    string a,b;
    long long a1,b1,flag,suma,sumb,sum,sumz;
    char c[6]= {'A','B','C','D','E','F'};
    long long d[6],k;
    string love;
    while(cin>>a>>b)
    {
        for(int i=0; i<6; i++)
            d[i]=i+10;
        suma=0;
        sumb=0;
        for(int i=0; i<a.length(); i++)
        {
            if(a[i]>='A'&&a[i]<='Z')
            {
                for(int j=0; j<6; j++)
                    if(a[i]==c[j])
                    {
                        suma+=(d[j]*pow(16,a.length()-i-1));
                        //cout<<d[j]*pow(16,d[j]*a.length()-i-1)<<endl;
                    }
            }
            else if(a[i]-'0'>=0&&a[i]-'0'<=9)
            {
                suma+=((a[i]-'0')*pow(16,a.length()-i-1));
                // cout<<(a[i]-'0')*pow(16,a.length()-i-1)<<endl;
            }
            //cout<<suma<<endl;
            //else continue;
        }
        for(int i=0; i<b.length(); i++)
        {
            if(b[i]>='A'&&b[i]<='Z')
            {
                for(int j=0; j<6; j++)
                    if(b[i]==c[j])
                    {
                        sumb+=(d[j]*pow(16,b.length()-i-1));
                        // cout<<d[j]*pow(16,b.length()-i-1)<<endl;
                    }
            }
            if(b[i]-'0'>=0&&b[i]-'0'<=9)
            {
                sumb+=((b[i]-'0')*pow(16,b.length()-i-1));
                //cout<<(b[i]-'0')*pow(16,b.length()-i-1)<<endl;
            }

            //else continue;
        }
        if(a[0]=='-')
            suma=-suma;
        if(b[0]=='-')
            sumb=-sumb;
        sum=suma+sumb;
        //cout<<sum<<endl;
        k=0;
        if(sum<0)
            sumz=-sum;
            else sumz=sum;
        while(sumz/16)
        {

            if(sumz%16>9)
            {
                for(int i=0; i<6; i++)
                    if(sumz%16==d[i])
                        love[k]=c[i];
                        //cout<<love[k]<<endl;
            }
            else love[k]=sumz%16+'0';
            k++;
            sumz/=16;
        }
        if(sum<0)
            cout<<'-';
        if(sumz%16>9)
        {
            for(int i=0; i<6; i++)
                if(sumz%16==d[i])
                    cout<<c[i];
        }
        else cout<<sumz%16;
        for(int i=k-1; i>=0; i--)
            cout<<love[i];
        cout<<endl;
    }
    return 0;
}

第二种方法:十六进制可以直接相加,,还有这种操作,,长见识了…………

%I64X :输出【无符号】十六进制数, 用大写字母  ,也就是说 %I64X 的格式【无法输出负数的】,但运算结果是有负数的。
一种简单的方法就是,把负数取绝对值,然后手工添加一个负号,

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
    long long a,b,sum;
    while(~scanf("%I64X %I64X",&a,&b))
    {
        //cout<<a<<b<<endl;
        sum=a+b;
        if(sum>=0)
            printf("%I64X\n",sum);
        else printf("-%I64X\n",-sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shaodongyue/article/details/81783323