pku-1001

来源:互联网 发布:通辽网络优化工程师 编辑:程序博客网 时间:2024/04/29 19:18
#include <stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

const int OneNode = 1000000 ;//一位里不能超过OneNode
const int NodeLen = 6 ;//一位储存NodeLen位,和OneNode必须同时更改,输出部分格式必须跟随这里!!!
const int NumMax = 10005 ;//储存位数限制,真实位数为NumMax*6
struct BigNum
{
    unsigned num[NumMax] ;
//高位 对 下标大位
    unsigned numlen ;
    
void set(unsigned sm=0){ num[0= sm ; numlen = 1; }//sm<OneNode
    void set(char *string , int strlen)
    
{
        numlen 
= (strlen-1/ NodeLen + 1 ;
        memset (num , 
0 , sizeof(unsigned)*numlen );        
        
int temp , i ;
        
for( i=strlen-1 ; i>=0 ; i-- )
        
{
            temp 
= i / NodeLen ;
            num[temp] 
= num[temp]*10 + string[strlen-1-i]-'0' ;
        }

    }

    
void print()
    
{
        printf(
"%d",num[numlen-1]);
        
int i = numlen-1;
        
while( i )
        
{
            i
--;
            printf(
"%06d",num[i]);
        }

        printf(
" ");
    }

}
;

void Add(BigNum &a,BigNum &b,BigNum &c) // a+b ->c 
{
    unsigned lenmax 
= a.numlen>b.numlen?a.numlen:b.numlen;
    c.numlen 
= lenmax;
    unsigned i,carry
=0;
    
for ( i=0 ; i<lenmax ; i++ )
    
{
        c.num[i] 
= carry ;
        
if( a.numlen > i )
            c.num[i]
+= a.num[i];
        
if( b.numlen > i )
            c.num[i]
+= b.num[i];
        carry 
= c.num[i] / OneNode ;
        c.num[i] 
%= OneNode ;
    }

    
if ( carry )
    
{
        c.num[i] 
= carry ; 
        c.numlen 
++
    }

}


void Mul(BigNum &a,BigNum &b,BigNum &c) // a*b ->c
{
    unsigned carry 
= 0 , lenmax = a.numlen+b.numlen-1 ,i,j ;
    unsigned __int64 temp ;
    c.numlen 
= lenmax;
    
for ( i=0 ; i<lenmax ; i++ )
    
{
        temp 
= carry ;
        
for ( j=0 ; j<a.numlen ; j++ )
        
{
            
if ( i<j )
                
break;
            
if ( i->= b.numlen )
            
{
                j 
= i-b.numlen ;
                
continue;
            }
            
            temp 
+= (unsigned __int64)a.num[j] * b.num[i-j] ;
        }

        carry 
= temp / OneNode ;
        c.num[i] 
= temp % OneNode ;    
    }

    
if(carry)
    
{
        c.num[i] 
= carry ; 
        c.numlen 
++;
    }

    
while(c.numlen>1&&!c.num[c.numlen-1])
        c.numlen
--;
}


int Cmp(BigNum &a,BigNum &b)          //a>b --> 1 , > --> -1 ,== --> 0
{
    
if( a.numlen>b.numlen )
        
return 1;
    
if( a.numlen<b.numlen )
        
return -1;
    
int len = a.numlen ;
    
while(len)
    
{
        len 
--;
        
if(a.num[len]>b.num[len])return 1;
        
if(a.num[len]<b.num[len])return -1;
    }

    
return 0;
}


void Cpy(BigNum &a , BigNum &b)    //b-->a
{
    a.numlen
=b.numlen;
    memcpy(a.num,b.num,
sizeof(unsigned)*b.numlen);
}


void Sub( BigNum &a , BigNum b ) //a-b -> a , a>=b
{
    unsigned i 
= 0;
    unsigned carry 
= 0 ;
    
for ( i=0 ; i<b.numlen ; i++ )
    
{
        a.num[i] 
= a.num[i]-carry-b.num[i];
        
if(a.num[i]>OneNode) //有进位(由于相减如果小于0会向上溢出)
        {
            a.num[i] 
+= OneNode ;
            carry 
= 1;
        }

        
else carry = 0;
    }

    
while(carry)
    
{
        
if(a.num[i])
        
{
            a.num[i] 
--;
            carry 
= 0;
        }

        
else 
        
{
            a.num[i] 
= OneNode-1;
            i
++;
        }

    }

    
while(a.num[a.numlen-1]==0 && a.numlen!=1)    
    
{
        a.numlen 
--;
    }

}

void Div(BigNum &a,int b,int &l)    // a/=b -> 余数l
{
    
int carry=0;
    
int i;
    
for(i=a.numlen-1;i>=0;i--)
    
{
        a.num[i]
+=carry*OneNode;
        carry
=a.num[i]%b;
        a.num[i]
/=b;
    }

    
if(a.numlen>1&&!a.num[a.numlen-1])a.numlen--;
    l
=carry;
}


BigNum a, b, c, d;

char out[60005];

int main ()
{
    
char in[50];
    
int flag;
    
int n;
    
int i, j;

    
while ( scanf ( "%s%d"&in&n ) != EOF )
    
{
        
int len = strlen ( in );
        flag 
= 0;
        
for ( i=0; i<len; i++ )
        
{
            
if ( in[i] == '.' )
            
{
                flag 
= ( len - i - 1 ) * n;
                
for ( j=i+1; j<len; j++ )
                
{
                    
in[j-1= in[j];
                }

                
in[j] = in[j+1];
                len 
--;
                
break;
            }

        }


        a.
set ( "1"1 );
        b.
set ( in, len );
        c.
set ( "0"1 );

        
if ( ! Cmp ( b, c ) )
        
{
            printf ( 
"0 " );
            
continue;
        }


        
while ( n != 0 )
        
{
            
if ( n & 1 )
            
{
                Mul ( a, b, c );
                Cpy (a, c);
            }

            Cpy ( d, b );
            Mul ( b, d, c );
            Cpy ( b, c );
            n 
>>= 1;

        }


        
int l;
        
int count = 0;
        
int p = 0;
        b.
set ( "0"1 );
        
while ( Cmp ( a, b ) || count <= flag )
        
{
            Div ( a, 
10, l );
            
if ( count == flag && flag )
            
{
                
out[p++= '.';
            }

            
out[p++= (char)(l + '0');
            count 
++;
        }


        
out[p] = '
 
原创粉丝点击