uva 748

#include <stdio.h>
#include <string.h>

#define maxn 1000000

char r[maxn];		/*str for user*/
int n;	
int pos; 			
typedef struct num{
	int val[maxn];	/*store num get from str*/	
	int len;     	/*size for num store in val*/      
	int pos;	/* pos offset for dot*/
}num_t;
		
num_t lft, rht, out; 			

void multiply(num_t *out, const num_t *lft, const num_t *rht);
int check_num(num_t *in);  /*@note: clean zero action*/

void multiply(num_t *out, const num_t *lft, const num_t *rht){
	int i, j, tmp, up;
	for(i = 0; i < lft->len; i++){
		up = 0;
		for(j = 0; j < rht->len; j++){
			tmp =  lft->val[i] * rht->val[j] + out->val[i + j] + up;
			out->val[i+j] = tmp%10;
			up = tmp/10;	
		}
		out->val[i + j] += up; 
	}
	out->len = i + j ;
	out->pos = lft->pos + rht->pos;
}

void output(num_t *in){
	int i, startpos, endpos;
	if(0 == in->pos){
		for( i = in->len - 1; i >=0; i--){		/*get start pos*/
			if(in->val[i])
				break;			
		}
		startpos = i;
		endpos   = 0;
	}else{
		for(i = in->len - 1; i > in->pos - 1; i--){		/*get start pos*/
			if(in->val[i])
				break;			
		}
		startpos = i;
		for(i = 0; i <=in->pos - 1; i++){
			if(in->val[i])
				break;
		}
		endpos = i;
	}
	if(startpos < endpos){
		printf("0");
		return;
	}
	for(i = startpos; i >= endpos; i--){
		if(i == in->pos - 1)
			printf(".");
		printf("%d", in->val[i]);
	
	}

}


void store(num_t *lft, char *r)				/*put str into num_t*/
{
	int i, j;
	int posflag = 1;				/*flag set pos action*/					
	int size = strlen(r);
	lft->pos = 0;
	for(i = size - 1 , j = 0; i >= 0 ; i--){	/*change str to num_t step by step*/
		if(r[i] == '.'){
			posflag = 0;			/*pos about dot set end*/
		}else{
			lft->val[j++] = r[i] - '0';
			if(posflag){
				++lft->pos;		/*update pos offset*/
			}
		}
	}
	if(posflag){					/*no pos find*/
		lft->pos = 0;
		lft->len = size;
	}else{
		lft->len = size -1;
	}
}


int main()
{
	int i, j;
	while( scanf("%s%d", r, &n) != EOF){
		memset(&lft, 0, sizeof(lft));
		store(&lft, r);	/*change the str to num_t*/
#ifdef DEBUG
		output(&lft); 
		printf("\n");
#endif
		memset(&rht, 0, sizeof(rht));			
		memset(&out, 0, sizeof(out));
		memcpy(&rht, &lft, sizeof(lft));
		while(--n){
			multiply(&out, &lft, &rht);
			memset(&rht, 0, sizeof(rht));
			memcpy(&rht, &out, sizeof(out));
			memset(&out, 0, sizeof(out));
		}
		output(&rht);
		printf("\n");
	}
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值