#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;
}
uva 748
最新推荐文章于 2019-07-31 10:04:20 发布