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:快要崩溃了,谁帮忙看一下In Reply To:快要崩溃了,谁帮忙看一下 Posted by:ahlongxp at 2006-10-05 15:54:29 presentation error吧 题目是输入一堆然后出一堆 > 代码: > #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