UVa 748 - Exponentiation

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

分析:模拟。先将小数化成整数,按大整数计算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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值