/**/////////////////#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>/*int cchkdig(char *r){int i=0;while(r[i]!=‘\0‘){if(isdigit(r[i++])==0)return (0);}return (1);} */void del_0(char *r) //去掉整数串表示前面多余的零,最后结果为空串时置为"0"{unsigned int lr;int i=0, j;lr=strlen(r);while(r[i]==‘0‘)++i;if(i>0){for(j=0; j<lr-i; ++j)r[j]=r[j+i];for(j=lr-i; j<lr; ++j){r[j]=‘\0‘;}}if(r[0]==‘\0‘){r[0]=‘0‘;}}int scmp(char *r, char *u) //比较长度{unsigned int lr, lu;del_0(r);del_0(u);lr=strlen(r);lu=strlen(u);if(lr>lu){return 1;}else if (lr<lu){return -1;}return (strcmp(r, u));}char *sub(char *r, char *u) //两个串表示数的减法{unsigned int i,lr, lu, lp,c=0;char h,hc;char *p;if(scmp(r, u)<0) //r比u大return NULL;lr=strlen(r);lu=strlen(u);p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));for(i=0; i<lu; ++i){h=r[lr-i-1]-u[lu-i-1]-c;if(h<0){c=1;h=h+10;}elsec=0;p[i]=h+‘0‘;hc=h+‘0‘;}for (i=lu; i<lr; ++i){h=r[lr-i-1]-‘0‘-c;if(h<0){c=1;h=h+10;}elsec=0;p[i]=‘0‘+h;hc=‘0‘+h;}p[i]=‘\0‘;lp=i-1;while(p[lp]==‘0‘&&lp!=0){p[lp]=‘\0‘;lp--;}for(i=0; i<(lp+1)/2; ++i){hc=p[i];p[i]=p[lp-i];p[lp-i]=hc;}return (p);}//end sub()char *add(char *r, char *u) //两个串表示数的加法{unsigned int lr, lu, lp;int i, h, c=0;char hc, *p;lr=strlen(r);lu=strlen(u);if(lu>lr){p=r;r=u;u=p;h=lr;lr=lu;lu=h;}p=(char *)malloc((unsigned int)(lr+2)*sizeof(char));for(i=0; i<lu; ++i){h=r[lr-i-1]-‘0‘+u[lu-i-1]-‘0‘+c;if(h>9){c=1;h=h-10;}elsec=0;p[i]=h+‘0‘;}for(i=lu; i<lr; ++i){h=r[lr-i-1]-‘0‘+c;if(h>9){c=1;h=h-10;}elsec=0;p[i]=‘0‘+h;}if(c>0){p[i]=c+‘0‘;lp=i;}elselp=i-1;for(i=lp+1; i<lr+2; ++i)p[i]=‘\0‘;for(i=0; i<(lp+1)/2; ++i){hc=p[i];p[i]=p[lp-i];p[lp-i]=hc;}return (p);}//end add()char *mul(char *r, char *u) //两个串表示数的乘法{unsigned int lr, lu, lp;int i, j, c, h;char *p;lr=strlen(r);lu=strlen(u);p=(char *)malloc((unsigned int)(lr+lu+1)*sizeof(char));for(i=0; i<lr+lu; ++i)p[i]=‘0‘;p[lr+lu]=‘\0‘;for(i=lr-1; i>=0; --i){c=0;for(j=lu-1; j>=0; --j){lp=i+j+1;h=(r[i]-‘0‘)*(u[j]-‘0‘)+p[lp]-‘0‘+c;c=h/10;h=h%10;p[lp]=h+‘0‘;}if(c>0)p[i+j+1]=c+‘0‘;}del_0(p);return p;}//end mul()char *div(char *u, char *v, int n) //两个串表示数的除法,结果精确到小数点后第n位{char *p, *f, *r,*q;unsigned int i, lu, lv, lr, iw, c, h;int kh, j;lu=strlen(u);lv=strlen(v);f=(char *)malloc((unsigned int)(lu+n+3)*sizeof(char));q=(char *)malloc(sizeof(char));for(i=0; i<lu+n+3; ++i)f[i]=‘\0‘;r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));for(i=0; i<lv+2; ++i)r[i]=‘\0‘;for(iw=0; iw<lu+n+2; ++iw){if(iw<lu){del_0(r);lr=strlen(r);r[lr]=u[iw];r[lr+1]=‘\0‘;}else if(iw>lu){del_0(r);q[0]=‘0‘;if(scmp(r, q)==0){break;}lr=strlen(r);r[lr]=‘0‘;r[lr+1]=‘\0‘;}else{f[lu]=‘.‘;continue;}kh=0;while(scmp(r, v)>=0){p=r;r=sub(p, v);++kh;}f[iw]=kh+‘0‘;}if(iw==lu+n+2){if(f[lu+n+1]>=‘5‘){f[lu+n+1]=‘\0‘;c=1;for(j=lu+n; j>=0; --j){if(c==0){break;}if(f[j]==‘.‘){continue;}h=f[j]-‘0‘+c;if(h>9){h=h-10;c=1;}elsec=‘\0‘;f[j]=h+‘0‘;}}elsef[lu+n+1]=‘\0‘;}free(r);free(p);q=NULL;free(q);del_0(f);return(f);}//end div()/*//两个串表示数的除法,结果分别用整商与余数表示char *sdivkr(char *u, char *v, char **rout){char *f, *r;unsigned int i, lu, lv, lr, iw;int kh;lu=strlen(u);lv=strlen(v);f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));for(i=0; i<lu+1; ++i) f[i]=‘\0‘;r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));for(i=0; i<lv+2; ++i) r[i]=‘\0‘;for(iw=0; iw<lu; ++iw){del_0(r);lr=strlen(r);r[lr]=u[iw];r[lr+1]=‘\0‘;kh=0;while(scmp(r, v)>=0){r=sub(r, v);++kh;}f[iw]=kh+‘0‘;}del_0(r);*rout=r;del_0(f);return(f);}//end *sdivkr()*//*调用上述函数实现两任意长正整数任意指定精度的算术计算器程序void main(int argc, char *argv[]){char *p, *r;int n;if(argc!=4){if(argc!=3)printf("\n>>\"order n1 op n2\" or n ! ");exit(0);}del_0(argv[1]);if(cchkdig(argv[1])==0){printf("Input data error, Input again!");exit(0);}del_0(argv[3]);if(cchkdig(argv[3])==0){printf("Input data error, Input again!");exit(0);}if(strcmp(argv[2], "+")==0){printf("%s", p=add(argv[1], argv[3]));free(p);}else if(strcmp(argv[2], "-")==0){printf("%s", p=sub(argv[1], argv[3]));free(p);}else if(strcmp(argv[2], "*")==0){printf("%s", p=mul(argv[1], argv[3]));free(p);}else if(argv[2][0]==‘/‘ && strlen(argv[2])==1){if(argv[3][0]==‘0‘){printf("error!devided by zero!!\n");exit(0);}p=sdivkr(argv[1], argv[3], &r);printf("k=%s r=%s", p, r);free(p);free(r);}elseif(argv[2][0]==‘/‘&&strlen(argv[2])>1){if(argv[3][0]==‘0‘){printf("error!devided by zero!!\n");exit(0);}argv[2][0]=‘\0‘;del_0(argv[2]);if(cchkdig(argv[2])==0){printf("Input data error, Input again!");exit (0);}n=atoi(argv[2]);printf("%s", p=div(argv[1], argv[3], n));free(p);}} */char a[200000];int main(){//freopen("read.txt", "r", stdin);int n;scanf("%d", &n);while(n--){memset(a, ‘\0‘, sizeof(a));char b[200] = {"0"};while(~scanf("%s", a) && a[0] != 0){strcpy(b, add(a, b));}printf("%s\n", b);if(n!=0) printf("\n");}return 0;}
原文:http://www.cnblogs.com/sober-reflection/p/1bcdc370a0830eb0727da1c9ab766cbf.html