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-j >= 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] = '
#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-j >= 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] = '
- pku-1001
- pku 1001
- pku 1001
- PKU-1001
- PKU 1001 Exponentiation
- pku online 1001
- PKU 1001 完成纪录
- PKU 1001 Exponentiation
- PKU 1001 Exponentiation
- PKU 1001 高精度乘幂
- pku ACM 1001
- pku oj 1001 Exponentiation
- PKU ACM 1001(大数相乘)
- 北大PKU在线测试1001
- pku 1001 高精度 Exponentiation 解题报告
- PKU-1001 Exponentiation(浮点数相乘)
- pku 1018 && pku 1095
- pku 3345 && pku 3107
- php的post数据获取说明
- 如何成为一个合格的中层领导?
- 分析Linux和Windows动态库(转)
- Rich Client
- ajax upload file
- pku-1001
- webkit + windows + cairo
- mysql时间函数
- 在C#中完成海量数据的批量插入和更新
- 在Fedora7英文环境下使用scim
- 平台+插件软件设计思想及基于COM的原型实现
- my boss - Jen
- fedora8英文环境下启用中文输入法(使用scim)
- windows下gtkmm编程环境搭建