Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:贴份AC代码,572K内存,0msIn Reply To:贴份AC代码,572K内存,0ms Posted by:39061224 at 2014-08-20 02:20:33 > #include <stdio.h> > #include <string.h> > > int buf[128]; > > typedef unsigned char byte; > > struct pfloat { > byte digit[128]; > int len; > int dot; > }; > > typedef struct pfloat pfloat; > > void pfloat_parse(char *input_str, pfloat *num) { > char *p = input_str+strlen(input_str)-1; > int post_zero = 0; > for (; p-input_str>=0 && *p == '0'; -- p) { > ++ post_zero; > } > > if (p-input_str>=0) { > int dot = 0; > for (; p-input_str>=0 && *p != '.'; -- p, ++ dot) { > num->digit[dot] = *p-'0'; > } > -- p; > if (p-input_str>=0) { // has dot > int i, j; > for (i = dot; p-input_str>=0; -- p, ++ i) { > num->digit[i] = *p-'0'; > } > for (j = i-1; j > -1 && num->digit[j] == 0; -- j); > num->len = j+1; > num->dot = dot; > } > else { > int j; > for (j = dot-1; j > -1 && num->digit[j] == 0; -- j); > num->len = j+1; > num->dot = -post_zero; > } > } > else { > num->len = 0; > num->dot = 0; > } > } > > void pfloat_multi(pfloat *a, pfloat *b, pfloat *r) { > memset(buf, 0, sizeof(int)*128); > > for (int i = 0; i < a->len; ++ i) { > for (int j = 0; j < b->len; ++ j) { > buf[i+j] += a->digit[i] * b->digit[j]; > } > } > > int c = 0; int len; > for (len = 0; len < a->len+b->len-1; ++ len) { > int k = buf[len]+c; > buf[len] = k%10; > c = k/10; > } > if (c || buf[len]) { > buf[len] = buf[len]+c; > ++ len; > } > > for (int i = 0; i < len; ++ i) { > r->digit[i] = buf[i]; > } > r->len = len; > r->dot = a->dot + b->dot; > } > > void pfloat_print(pfloat *p) { > if (p->len == 0) { > printf("0\n"); > return; > } > > if (p->dot <= 0) { > for (int i = 0; i < p->len; ++ i) { > printf("%d", p->digit[p->len-1-i]); > } > for (int i = p->dot; i < 0; ++ i) { > printf("0"); > } > } > > else if (p->dot < p->len) { > int i; > for (i = 0; i < p->len-p->dot; ++ i) { > printf("%d", p->digit[p->len-1-i]); > } > printf("."); > for (; i < p->len; ++ i) { > printf("%d", p->digit[p->len-1-i]); > } > } > > else { > printf("."); > for (int i = 0; i < p->dot-p->len; ++ i) { > printf("0"); > } > for (int i = 0; i < p->len; ++ i) { > printf("%d", p->digit[p->len-1-i]); > } > } > printf("\n"); > } > > int main(int argc, char **argv) > { > char input[32]; > int exp; > > pfloat *a = new pfloat, *b = new pfloat; > while (scanf("%s%d", input, &exp) != EOF) { > pfloat_parse(input, a); > b->len = 1, b->digit[0] = 1, b->dot = 0; > for (int i = 0; i < exp; ++ i) { > pfloat_multi(a, b, b); > } > pfloat_print(b); > } > delete a, delete b; > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator