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 |
快要崩溃了,谁帮忙看一下代码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned long long _100k; int findchar(char* s, char c, int startPos) { int len = strlen(s); int i; for(i = startPos;i<len; ++i) { if(s[i]==c) { return i; } } return -1; } char* delzero(char*s) { int pos = findchar(s,46,0); if(pos == -1) return s; int len = strlen(s); while(s[--len]=='0') { s[len] = 0; } return s; } int getdotPos(char*s, int n) { int pos = findchar(s,46,0); if(pos == -1) return 0; return(strlen(s+pos+1)*n); } char* deldot(char*s) { int len = strlen(s); if(len<1)return 0; int pos = findchar(s,46,0); if(pos == -1) return s; char tmpstr[200]={0}; strncpy(tmpstr, s, pos); tmpstr[pos] = 0; strcat(tmpstr, s+pos+1); return strdup(tmpstr); } char* docalc(char*s, int n) { long base = atol(s); _100k re[2][40]; memset((void*)re, 0, sizeof(re)); re[1][0]=base;// int i,j; int psize = 1; int newsize = 0; _100k overflow = 0; for(i=0; i<n-1; ++i) { memset((void*)re[i%2], 0, sizeof(re[0])); for(j=0; j<psize; ++j) { re[i%2][j] = re[1-(i%2)][j] * base + overflow; ; if(re[i%2][j]>99999) { overflow = re[i%2][j] / 100000; re[i%2][j] %= 100000; re[i%2][j+1] += overflow; if (psize <= j+1) { newsize = psize + 1; if (psize > sizeof(re[0])) { printf("overflow\n"); return; } //continue; } } } if (newsize > psize) psize = newsize; overflow = 0; } char tmpstr[200] = {0}; char tmptmp[20]; for( j=psize; j>0; --j) { sprintf(tmptmp, j!=psize?"%05d":"%d", re[1-i%2][j-1]); strcat(tmpstr, tmptmp); } return strdup(tmpstr); } char* addzero(char*s, int dotpos) { if(dotpos==0)return s; int len = strlen(s); if(len<dotpos) { char tmpstr[200]; memset((void*)tmpstr, '0', dotpos-len); tmpstr[dotpos+1-len] = 0; strcat(tmpstr, s); return strdup(tmpstr); } return s; } char* adddot(char*s, int dotpos) { if(dotpos ==0)return s; int len = strlen(s); char tmpstr[200] ={0}; strncat(tmpstr, s, len-dotpos); tmpstr[len-dotpos] = '.'; tmpstr[len-dotpos+1] = 0; strcat(tmpstr, s+len-dotpos); return strdup(tmpstr); } char* doit (char s[], int n) { if (!n || (atoi(s) == 0 &&findchar(s,46,0)==-1) || atof(s)==0.0) { return "1"; } char* output; output = delzero(s); int dotpos = getdotPos(output, n); //printf("dotpos:%d \n", dotpos); output = deldot(output); output = docalc(output, n); output = addzero(output, dotpos); output = adddot(output, dotpos); return strdup(output); } int main (int argc, char *argv[]) { char s[7]; int n; char output[200]; while (scanf("%s %d", s, &n) == 2) { puts(doit(s, n)); } return 0; } 测试数据: 95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12 0000 0 000.02 0 00001 1 000002 0 2.0 3 0000.50 3 测试结果: 548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201 1 1 1 1 8 .125 Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator