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 |
贴份AC代码,572K内存,0ms#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