hdoj-1753-大明A+B(大数)
发布时间:2020-12-14 02:26:45 所属栏目:大数据 来源:网络整理
导读:大明A+B Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10109????Accepted Submission(s): 3630 Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫
大明A+B
Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10109????Accepted Submission(s): 3630
Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。 现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
?
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
?
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
?
Sample Input
?
Sample Output
?解题思路:
? ? ? ? ?这是用大数来解决小数加减。
? ? ? ? ?将给定的数据分为整数和小数部分,整数逆着存到一个数组(从0开始),小数正着存到一个数组(从1开始)。
? ? ? ? ?先进行小数运算,逆着运算;然后将小数[0]加到整数[0],然后整数运算,正着运算。
? ? ? ? ?然后清除整数数组后面多余的0,逆着输出,清除小数后面的0,并判断是否到0,否则输出小数点,且小数数组正着输出。
代码:
#include<stdio.h> #include<string.h> char a[410],b[410]; int za[410],zb[410]; int xa[410],xb[410]; int ze[410],xe[410]; int main() { int lena,lenb; int poa,pob; int now; int i,j,k; int lxa,lxb; while(scanf("%s%s",a,b)!=EOF) { lena=strlen(a); lenb=strlen(b); for(i=0;i<lena&&a[i]!='.';i++) { } poa=i; for(i=0;i<lenb&&b[i]!='.';i++) { } pob=i; //找小数点 memset(za,sizeof(za)); memset(zb,sizeof(zb)); memset(xa,sizeof(xa)); memset(xb,sizeof(xb)); //清空临时存储数组 for(i=poa-1,j=0;i>=0;i--,j++) za[j]=a[i]-'0'; for(i=pob-1,j++) zb[j]=b[i]-'0'; //整数逆着存储 for(i=poa+1,j=1;i<lena;i++,j++) xa[j]=a[i]-'0'; lxa=j-1; for(i=pob+1,j=1;i<lenb;i++,j++) xb[j]=b[i]-'0';//注意j从1开始 lxb=j-1; //小数正着存储 if(lxa<lxb) { lxa=lxb; }//找长的 memset(xe,sizeof(xe)); for(i=lxa;i>=0;i--) { xe[i]+=xa[i]+xb[i]; if(xe[i]>9) { xe[i-1]+=xe[i]/10; xe[i]%=10; } } //小数逆着运算 if(poa<pob) { poa=pob; } memset(ze,sizeof(ze)); if(xe[0]!=0) ze[0]+=xe[0];//小数[0]加到整数[0] for(i=0;i<=poa;i++) { ze[i]+=za[i]+zb[i]; if(ze[i]>9) { ze[i+1]+=ze[i]/10; ze[i]%=10; } } //整数正着运算 for(i=poa;i>=0&&ze[i]==0;i--) { } for(;i>=0;i--) printf("%d",ze[i]); for(i=lxa;i>0;i--) if(xe[i]!=0) break; if(i!=0) { j=i; printf("."); for(j=1;j<=i;j++) printf("%d",xe[j]); } printf("n"); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |