uva 748 浮点乘法幂

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20000
int main()
{
	int n, p, i, j, k, x, carrey;
	int num[MAX], num1[MAX], num2[MAX];
	char R[7];
	while( scanf( "%s %d", R, &n ) == 2 )
	{
		memset( num1, 0, sizeof(num1) );
		memset( num2, 0, sizeof(num2) );
		for( i = 0, j = 4; i < 6; i++ )
		{
			if( R[i] == '.' )
			{
				p = 5-i;
				p *= n;		//小数点的位置都与各个积的小数点之和 
			}
			else
				num1[j--] = R[i]-'0';
		}
		for(int i = 0; i < 5; i++ )
			num2[i] = num1[i];
		/*************计算部分****************/ 
		for(int  x = 1; x < n; x++ )
		{
			memset( num, 0, sizeof(num) );
			for(int i = 0; i < 5; i++ )		//why 6 ? not 5? 
			{
				
				carrey = 0;
				for(int  j = 0; j < MAX; j++ )
				{
					num[i+j] += num1[i] * num2[j] + carrey;
					carrey = num[i+j] / 10;
					num[i+j] %= 10;
				}
			}
			for(int i = 0; i < MAX; i++ )
				num2[i] = num[i];
		}
		/*************计算部分****************/ 
				
		/****去掉开头和结尾的0*****/ 
		for(i = MAX-1; i >= 0; i--)			//42312 . 021  =>   12021324000000
        	if( num[i] || i == p )	//找到开头  0.1234 => .1234  
				break;
    	for(j = 0; j <= i; j++)		//找到结尾 
        	if( num[j] ) 
				break;				// 0.1234 时,开头是. 
        /****去掉开头和结尾的0*****/
		 
    	for( k = i; k >= j; k--)
    	{
        	if( p == k && k == i ) //如果小数点在最开始 如:  0.123 或者 1.23 
        	{
        	    if( num[k] ) 		//1.23  打印成  1.23 
					printf( "%d.", num[k] );			
        	    else				//0.123   打印成 .123 
        	        printf( "." );   	
				continue;
        	}
        	printf( "%d", num[k] );
        	if( p == k && k != i) 	// 普通情况  123.32   23214.010123 
				printf(".");
    	}
    	printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值