题目:计算大整数的幂运算。
分析:模拟。先将小数化成整数,按大整数计算n-1次乘法;然后计算小数点后的位数控制输出格式。
计算过程:1.去除小数点后面的后导0;2.转化成整数;3.用乘法计算幂;4.计算小数位数输出。
说明:注意后面多余的0要去掉。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char a[200],b[200],c[200],d[200];
void deal( char* d, char* a )
{
strcpy( d, a );
int komm = -1;
for ( int i = 0 ; d[i] ; ++ i )
if ( d[i] == '.' ) {
komm = i;
break;
}
if ( komm == -1 ) return;
int len = strlen(d)-1;
while ( len > komm && d[len] == '0' ) {
d[len] = a[len] = 0;
len --;
}
for ( int i = komm ; d[i] ; ++ i )
d[i] = d[i+1];
}
void mul( char* d, char* a, char* b )
{
int a_buf[200],b_buf[200],c_buf[200];
memset( a_buf, 0, sizeof( a_buf ) );
memset( b_buf, 0, sizeof( b_buf ) );
memset( c_buf, 0, sizeof( c_buf ) );
int l_a = strlen(a),l_b = strlen(b);
int len = l_a+l_b+1;
for ( int i = 0 ; i < l_a ; ++ i )
a_buf[i] = a[l_a-1-i]-'0';
for ( int i = 0 ; i < l_b ; ++ i )
b_buf[i] = b[l_b-1-i]-'0';
for ( int i = 0 ; i < l_a ; ++ i )
for ( int j = 0 ; j < l_b ; ++ j )
c_buf[i+j] += a_buf[i] * b_buf[j];
for ( int i = 0 ; i < len ; ++ i )
if ( c_buf[i] > 9 ) {
c_buf[i+1] += c_buf[i]/10;
c_buf[i] %= 10;
}
while ( len > 0 && !c_buf[len] ) -- len;
for ( int i = 0 ; i <= len ; ++ i )
d[i] = c_buf[len-i]+'0';
d[len+1] = 0;
}
void output( char *a, int n , char *c )
{
//计算小数点位置
int komm = 0,len = strlen(c);
for ( int i = 0 ; a[i] ; ++ i )
if ( a[i] == '.' ) {
komm = strlen(a)-1-i;
break;
}
komm *= n;
if ( len < komm ) {
printf(".");
for ( int i = 0 ; i < komm-len ; ++ i )
printf("0");
printf("%s\n",c);
}else {
for ( int i = 0 ; i < len-komm ; ++ i )
printf("%c",c[i]);
if ( c[len-komm] )
printf(".%s\n",&c[len-komm]);
else printf("\n");
}
}
int main()
{
int n;
while ( ~scanf("%s%d",a,&n) ) {
deal( d, a );
strcpy( c, d );
for ( int i = 1 ; i < n ; ++ i ) {
strcpy( b, c );
mul( c, b, d );
}
output( a, n, c );
}
return 0;
}