题目描写很没意思..就是说给出n个小数 求它们的总和
因为给出的小数点后最多16位而要求保存至12位 而能直接使用的最精确的double只能到12位 于是13的进位可能被忽略 于是不可以用double
于是它就是一个很裸的小数高精度加法..还只是加法..
在比赛的时候学长很快就敲出来了代码并且AC 但是被别人极多提交的极短且超时代码唬住(猜测应该是直接相加) 以为直接相加的O(N)的复杂度尚且不可..所以甚至连试做都没有
赛后写出代码F9直接运行 但是小数上的进位转到整数上遗漏 更改后AC
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<map> using namespace std; int aq[300]; int bq[300]; int aw[300]; int bw[300]; char s[300]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(bq,0,sizeof(bq)); memset(bw,0,sizeof(bw)); for(int j=0; j<n; j++) { memset(aq,0,sizeof(aq)); memset(aw,0,sizeof(aw)); scanf("%s",s); int p=strlen(s); int len=p; int ge=0; for(int i=0; i<p; i++) { if(s[i]=='.') { p=i; break; } } int w=0; for(int i=p+1; i<len; i++) { aw[w++]=(s[i]-'0'); } int ww=0; for(int i=p-1; i>=0; i--) { aq[ww++]=(s[i]-'0'); } int jin=0; for(int i=w-1; i>=0; i--) { bw[i]+=aw[i]; bw[i]+=jin; jin=bw[i]/10; bw[i]%=10; } for(int i=0; i<ww; i++) { bq[i]+=aq[i]; bq[i]+=jin; jin=bq[i]/10; bq[i]%=10; } int where=ww; while(jin!=0) { bq[where]+=jin; jin=bq[where]/10; bq[where]%=10; where++; } } int jin=0; if(bw[12]>=5) { jin=1; for(int i=11; i>=0; i--) { bw[i]+=jin; jin=bw[i]/10; bw[i]%=10; if(jin==0) break; } if(jin!=0) { for(int i=0;; i++) { bq[i]+=jin; jin=bq[i]/10; bq[i]%=10; if(jin==0) break; } } } int ok=true; for(int i=270; i>=0; i--) { if(bq[i]!=0) ok=false; if(ok) continue; printf("%d",bq[i]); } if(ok) printf("0"); printf("."); for(int i=0; i<12; i++) printf("%d",bw[i]); printf(" "); } }