UVa 465 溢出

/*

* 解题思路:

*      题意很好理解、题目也没有陷阱、但是如果想用通俗方法( 不是网上很多就简单几行代码过题写法 )写这道题还是有些难度的、注意点如下

*      1、边界问题、上界是2147483647、自己可以测几组边界数据监测( 2147483647+1 和 2147483647 * 1 )

* 2、内部测试数据可以定有前缀为0的数、这里一定要判断好( 00000000000001 * 00000000000006 ) 

*      3、第三点我错了很久、先前直接只要两个数、任何一个数溢出、则我判断答案溢出,但是忘记考虑任何数乘以0都为0了!!

*/


#include <stdio.h>
#include <string.h>
#define A 300
char sample[ 15 ] = "2147483647";
char ss1[ A ],ss2[ A ],c[ 5 ];
char x[ A ];
int in;
int Judge( char sss[]  )
{
    int i;
    for( i=0;i<10;i++ )
    {
        if( sss[ i ]-‘0‘> sample[ i ]-‘0‘ ) return 1;
        if( sss[ i ]-‘0‘ < sample[ i ]-‘0‘ ) return 0;
    }
    return 0;
}
void calc( int len , int pos ,char s[] , char sum[] )
{
    int i;
    int x,y;
    if( !pos ) return;
    for( i=pos;i>=0;i-- )
    {
        x =     s[ i ] -‘0‘;
        y = sum[ i ] -‘0‘;

        if( x+y+in <= 9 &&  x+y+in >=0 )
        {
            sum[ i ] = ( char)( x+y+in+‘0‘ );
            in = 0;
        }
        else if( x+y+in > 9)
        {
            sum[ i ] = ( char )( (x+y+in)%10 )+‘0‘;
             in = 1;
        }
    }
}
int Mutiply( char s1[] ,char s2[] , int len1 ,int len2 )
{
    int x,y,z,zz=0;
    int i,j,k;
    int tmp,flag;
    int len;
    char ss[ A ],s[ A ];

    if( len1 > len2 )
    {
        strcpy( s , s1 );
        strcpy( s1,s2 );
        strcpy( s2 , s );
        tmp = len1;
        len1 = len2;
        len2 = tmp;
    }
     memset( ss , ‘0‘ , sizeof( ss ) );
    for( i=len2-1;i>=0;i-- )
    {
        in = 0;
        memset(   s , ‘0‘,  sizeof( s ) );
        for( j=len1-1;j>=0;j-- )
        {
            x = s1[ j ] - ‘0‘;
            y = s2[ i ] - ‘0‘;

            if( ( x*y+in) >= 10 )
            {
                s[ i+j ] = ( char )(( (x*y+in)%10 )+‘0‘);
                    in = (x*y+in)/10;
            }
            else if( (x*y+in )<=9 && (x*y+in ) >=0 )
            {
                s[ i+j ] =(char) (x*y+in +‘0‘);
                in = 0;
            }
        }
        if( in != 0 && i!=0 )
            s[ i-1 ] = in+‘0‘;
        flag = 0;
        for( j=i+len2-1;j>=0;j-- )
        {
            if( ss[ j ]-‘0‘ + s[ j ] -‘0‘ + flag >=10 )
            {
                ss[ j ] = (ss[ j ]-‘0‘ + s[ j ] - ‘0‘ + flag )%10+‘0‘;
                flag = 1;
            }
            else
            {
                ss[ j ] += s[ j ] -‘0‘+ flag;
                flag = 0;
            }
        }
        if( i == 0 && in+flag )
        {
            zz = 0;
            memset( s ,‘\0‘, sizeof( s ) );
            z = in + flag;
            while( z!=0 )
            {
                s[ zz++ ] = z%10+‘0‘;
                z/=10;
            }

            ss[ len1+len2-1+zz ] = ‘\0‘;
            len = strlen( ss );
            for( k=len+zz;k>=zz;k-- )
                ss[ k ] = ss[ k-zz ];
            for( k=0;k<zz;k++ )
                ss[ zz-k-1 ] = s[ k ];
        }
    }
    ss[ len1+len2-1+zz ] = ‘\0‘;
    len = strlen( ss );
    if( len >10 ) return 1;
    else if( len <10 ) return 0;
    else if( len == 10 ) return Judge( ss );
}
int Plus( char s[] ,char sum[] , int len1 , int len2 )
{
     int i;
    in = 0;
    if( len1 == 1 && s[ 0 ] == ‘0‘ ) return 0;

    if( len1 < len2 )
    {
        for(i=len1-1 ; i>=0 ;i-- )
            s[ i+len2-len1 ] = s[ i ];
        for( i=0;i<len2-len1;i++ )
            s[ i ] =‘0‘;
        sum[ len2 ] = ‘\0‘;
    }

    else if( len1 > len2 )
    {
        for( i=len2-1 ; i>=0;i-- )
            sum[ i+len1-len2 ] = sum[ i ];
        for( i=0;i<len1-len2;i++ )
            sum[ i ] = ‘0‘;
        sum[ len1 ] = ‘\0‘;
    }
    len1>=len2 ? calc( len1 , len1-1 , s , sum ) : calc( len2 , len2-1 , s , sum );
    if( in )
    {
        for( i=len2;i>0;i-- )
            sum[ i ] = sum[ i-1 ];
        sum[ 0 ] = ‘1‘;
        in = 0;
    }

    len2 = strlen( sum );
    if( len2 > 10 ) return 1;
    else if( len2 < 10 ) return 0;
    else if( len2 == 10 ) return Judge( sum );
}
int main( )
{
    int i,j;
    int flag,vis,sum;
    int len1,len2;

    char str[ 5 ][ 30 ] ={"first number too big","second number too big","result too big"};

    memset( ss1 , ‘0‘ , sizeof( ss1 ) );
    memset( ss2  ,  ‘0‘ , sizeof( ss2 ) )  ;
    while( ~scanf("%s%s%s",ss1,c,ss2) )
    {
        flag = vis = sum = 0;
        len1 = strlen( ss1 );
        len2 = strlen( ss2 );

        printf("%s %s %s\n",ss1,c,ss2 );

        for( i=0;i<len1;i++ )
            if(!vis && ss1[ i ] == ‘0‘ ) sum++;
            else break;
        if( sum )
        {
            j = 0;
            for( i=sum;i<len1;i++ )
                ss1[ j++ ] = ss1[ i ];
            len1 = j;
            ss1[ j ] = ‘\0‘;
        }

        vis = sum =0;
        for( i=0;i<len2;i++ )
            if(!vis && ss2[ i ] == ‘0‘ ) sum++;
            else break;
        if( sum )
        {
            j = 0;
            for( i=sum;i<len2;i++ )
                ss2[ j++ ] = ss2[ i ];
            len2 = j;
            ss2[ j ] = ‘\0‘;
        }

        if( len1 > 10 || ( len1 == 10 && Judge( ss1 ) )  )
             printf("%s\n",str[ 0 ] );

        if( len2 > 10 || ( len2 ==10 && Judge( ss2 ) )  )
            printf("%s\n",str[ 1 ] );

        if( c[ 0 ] == ‘+‘ && len1!=0 && len2 !=0 )
            if( Plus( ss1 , ss2 , len1 , len2 ) ) flag = 1;
        if( c[ 0 ] == ‘*‘ &&  len1!=0 && len2 !=0 )
            if( Mutiply( ss1 , ss2 , len1 , len2 ) ) flag = 1;
       if( flag ) printf("%s\n",str[ 2 ] );
    }
    return 0;
}


UVa 465 溢出

上一篇:微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结


下一篇:Python实现支付宝当面付之——扫码支付