练习场hit1002:ABC之和

题目:

  (acmhit1002)输入A,B,C三个数,三个数的范围都在int内,可正可负,要求输出这三个数的和。

 

思路:

  一开始的时候,我想试试longlong解决战斗,毕竟三个int加的再溢出也就能溢出一位。但是失败了……于是我以为需要老老实实的做大数加减法,于是搞了个能算两百位(应该是198)的程序。可是不管怎么上传都不对。后来没辙了网上一搜,发现……还是特么用的longlong,只是我的输入格式弄错了!我了一个去啊……我到现在都不敢确定到底是我下面这个程序有bug还是它不识别字符串输入(用a+b改出了一个字符串结果的确提示错误),总之先这样了,没有绝对正确的程序,只是你还没看出bug在哪嘛。这程序反正我现在是看不出bug在哪了……

 

方案:

  设置最长数位为200,设置数组存储abc,符号位单独记录,不存在数组内。通过两个数的正负关系确定加减法,通过加减法+字符串长度比较+字符串大小比较确定结果的符号。按位计算结果并输出。

 

代码:

由于是练习场,未加任何注释。好在代码不是太长。三个数的加减法只需要调用两次这个函数就好。

练习场hit1002:ABC之和
void TwoNumberCaculate(char *num1,char *num2,char *res)
{
    char *small,*large;
    int mark1=0,mark2=0,markres,len1,len2,i;
    int j=0,r_1[MAX_LEN]={0},r_2[MAX_LEN]={0},r_r[MAX_LEN]={0},of=0;
    if(num1[0]==-)
        mark1=1;
    if(num2[0]==-)
        mark2=1;
    
    len1=strlen(num1)-mark1;
    len2=strlen(num2)-mark2;
    
    for(i=len1-1;i>=0;--i)
        r_1[i]=num1[len1-1+mark1-i]-0;
        
    for(i=len2-1;i>=0;--i)
        r_2[i]=num2[len2-1+mark2-i]-0; 

    if(mark1==mark2)
    {    
        markres=mark1;
        for(i=0;i<=len1-1+mark1||i<=len2-1+mark1;++i)
        {
            r_r[i]=r_1[i]+r_2[i];
            
        }
        
        for(i=0;i<=len1-1+mark1||i<=len2-1+mark1;++i)
        {
            r_r[i]+=of;
            of=r_r[i]/10;
            r_r[i]%=10;
        }
        r_r[i]+=of;

    } 
    else
    {
        if(len1>len2||(len1==len2&&strncmp(num1+mark1,num2+mark2,len1)==1))
        {
            markres=mark1;
            for(i=0;i<=len1-1+mark1;++i)
            {
                r_r[i]=r_1[i]-r_2[i];
                if(r_r[i]<0)
                {
                    r_r[i]+=10;
                    --r_1[i+1];
                }
            }
        }
        else if(len2>len1||(len2==len1&&strncmp(num1+mark1,num2+mark2,len1)==-1))
        {
            markres=mark2;
            for(i=0;i<=len2-1+mark1;++i)
            {
                r_r[i]=r_2[i]-r_1[i];
                if(r_r[i]<0)
                {
                    r_r[i]+=10;
                    --r_2[i+1];
                }
            }
        }
        else
        {
            res[0]=0;
            res[1]=\0;
            return ;
        }    
    }
    
    if(markres==1)
        res[0]=-;
    for(i=MAX_LEN-1;r_r[i]==0;--i)
        ;
    j=0;
    for(;i>=0;--i,++j)
        res[j+markres]=r_r[i]+0;
    res[j+markres]=\0;
    printf("Res=%s\n",res);
}
练习场hit1002:ABC之和

练习场hit1002:ABC之和

上一篇:Activity生命周期


下一篇:远程连接桌面不能全屏显示的解决方法