admin 管理员组

文章数量: 887021

高精度

题目链接:A+B Problem IV

计算400位以内的小数加法

模板:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str1[405],str2[405];
int pre1[405],pre2[405],suf1[405],suf2[405],point1,point2;
int main()
{while(~scanf("%s%s",str1,str2)){memset(pre1,0,sizeof pre1);memset(pre2,0,sizeof pre2);memset(suf1,0,sizeof suf1);memset(suf2,0,sizeof suf2);point1=strlen(str1);point2=strlen(str2);for(int i=0;str1[i];i++){if(str1[i]=='.'){point1=i;break;}pre1[i]=str1[i]-48;}if(point1!=strlen(str1)){for(int i=point1+1;str1[i];i++)suf1[i-point1-1]=str1[i]-48;}//-----------------------for(int i=0;str2[i];i++){if(str2[i]=='.'){point2=i;break;}pre2[i]=str2[i]-48;}if(point2!=strlen(str2)){for(int i=point2+1;str2[i];i++)suf2[i-point2-1]=str2[i]-48;}//suf相加int up_to_pre=0;for(int i=400;i>=0;i--){suf1[i]+=suf2[i];if(i==0){up_to_pre=suf1[0]/10;suf1[0]%=10;}else if(suf1[i]>9){suf1[i-1]+=suf1[i]/10;suf1[i]%=10;}}//pre反转for(int i=0;i<point1/2;i++)swap(pre1[i],pre1[point1-i-1]);for(int i=0;i<point2/2;i++)swap(pre2[i],pre2[point2-i-1]);//pre相加pre1[0]+=up_to_pre;for(int i=0;i<point1 || i<point2;i++){pre1[i]+=pre2[i];if(pre1[i]>9){pre1[i+1]+=pre1[i]/10;pre1[i]%=10;}}//输出preint top=0;for(int i=400;i>=0;i--){if(pre1[i]){top=i;break;}}for(int i=top;i>=0;i--)printf("%d",pre1[i]);//输出sufint tail=-1;for(int i=400;i>=0;i--){if(suf1[i]){tail=i;break;}}if(tail!=-1){printf(".");for(int i=0;i<=tail;i++)printf("%d",suf1[i]);}printf("\n");}return 0;
}


本文标签: 高精度