1 条题解
-
0
C :
#include <stdio.h> #include <string.h> int add(char n1[],char n2[]){ int d1=strlen(n1),d2=strlen(n2); int i=d1>=d2?d1:d2,r=0,t; char *s=d1>=d2?n1:n2; while(d1--&&d2--){ r+=n1[d1]+n2[d2]-'0'; if(r>'9') t=10; else t=0; s[--i]=r-t; r=t/10; } while(r&&i--){ s[i]++; if(s[i]>'9'){ s[i]-=10; r=1; }else r=0; } return r; } int main(){ char n[2][405]; while(~scanf("%s %s",n[0],n[1])){ char na[2][405]={0},nb[2][405]={0},*ptr; int i,dot=0,t=0,mi,ni,l[2]; for(i=0;i<2;i++){ nb[i][0]='0';nb[i][1]=0; ptr=strstr(n[i],"."); if(ptr){ dot=ptr-n[i]; strncpy(na[i],n[i],dot); na[i][dot]=0; strcpy(nb[i],&n[i][dot+1]); }else strcpy(na[i],n[i]); l[i]=strlen(nb[i]); } if(l[0]<l[1]) while(l[0]!=l[1]) nb[0][l[0]++]='0'; else while(l[0]!=l[1]) nb[1][l[1]++]='0'; t=add(nb[0],nb[1]); if(t)na[0][strlen(na[0])-1]++; t=add(na[0],na[1]); if(t)printf("1"); if(strlen(na[0])>=strlen(na[1])) printf("%s",na[0]); else printf("%s",na[1]); for(i=l[0]-1;i>=0;i--) if(nb[0][i]=='0')nb[0][i]=0; else break; t=strlen(nb[0]); if(t!=0&&(t!=1||nb[0][0]!='0')) printf("."); printf("%s\n",nb[0]); } return 0; }
C++ :
#include<cstdio> #include<cstring> #define max(a,b) a>b?a:b struct Num{ int len,back;//len 为 字符串长度 back 为小数的位数 char num[800]; }A,B; void swap(char &a,char &b){ char t=a; a=b; b=t; } void Init(Num &a){ // 去除小数末尾的零,但至少有一位小数 a.len=strlen(a.num); char *p=strchr(a.num,'.'); if(p==NULL){ //如果是整数,补充小数点和一位小数 a.num[a.len++]='.'; a.num[a.len++]='0'; a.back=1; } else{ int point_loc=p-a.num;//记录小数点的位置,去除小数末尾的零 for(int i=a.len-1;i>=point_loc+2;i--){ if(a.num[i]!='0') break; a.len--; } a.back=a.len-1-point_loc; } } void Reverse(Num &a){ for(int i=0;i<a.len-1-i;i++) swap(a.num[i],a.num[a.len-1-i]); } void add(Num &a,Num &b){ Reverse(a); int sub=a.back-b.back;//小数位数的差值 int max_len=max(b.len+sub,a.len);//两个数中最大的位数 memset(a.num+a.len,'0',max_len-a.len+1);//反转高位补零。 for(int i=sub;i<max_len;i++){//模拟每一位相加 if(a.num[i]=='.') continue; int b_loc=b.len-1-(i-sub); if(b_loc>=0) a.num[i]+=b.num[b_loc]-'0'; if(a.num[i]>'9'){ a.num[i+1]=='.'?a.num[i+2]++ : a.num[i+1]++; a.num[i]-=10; } } int min_loc;//记录小数部分不为零的位置。 for(min_loc=0;a.num[min_loc]=='0';min_loc++); max_len= a.num[max_len]=='0' ? max_len-1 : max_len;//如果最高位有进位 输出。 min_loc=a.num[min_loc]=='.' ? min_loc+1 : min_loc;//如果小数为只有一个小数点,则不必要输出 for(int i=max_len;i>=min_loc;i--) printf("%c",a.num[i]); printf("\n"); } int main(){ while(scanf("%s%s",A.num,B.num)!=EOF){ Init(A); Init(B); A.back>B.back?add(A,B):add(B,A); } }
Java :
import java.io.*; import java.util.Scanner; import java.math.BigDecimal; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()){ BigDecimal a=sc.nextBigDecimal(); BigDecimal b=sc.nextBigDecimal(); BigDecimal c=a.add(b); if(c.compareTo(BigDecimal.ZERO) == 0){ System.out.println(0); }else{ String res = c.stripTrailingZeros().toPlainString(); //整数去掉小数点和后面的0 System.out.println(res); } } } }
- 1
信息
- ID
- 212
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 0
- 上传者