UVa 748 - Exponentiation

来源:互联网 发布:林俊杰黑暗骑士知乎 编辑:程序博客网 时间:2024/05/16 02:04

题目:计算大整数的幂运算。

分析:模拟。先将小数化成整数,按大整数计算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;}

0 0