lzh

刘政
posts - 17, comments - 1, trackbacks - 0, articles - 1

杭电1753

Posted on 2010-09-08 08:36 lzh525 阅读(559) 评论(0)  编辑 收藏 引用 所属分类: big num

大明A+B

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2316    Accepted Submission(s): 688


Problem Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。

现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
 

Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
 

Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
 

Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
 

Sample Output
4 3.4555434454 2.1
 

Author
linle
 1 #include<iostream>
2 #include<string.h> 3 #include<stdio.h> 4 5 #define N 1200 6 #define MAX 3000 7 char m[MAX],n[MAX],s[5][MAX]; 8 int len[5],p; 9 using namespace std; 10 11 void init() 12 { 13 int i,j; 14 for(i=0;i<=4;i++) 15 { 16 for(j=0;j<MAX;j++) 17 { 18 s[i][j]='0'; 19 } 20 len[i]=0; 21 } 22 } 23 24 void turn(char *s,int n) //翻转函数 25 { 26 int i; 27 char temp; 28 for(i=0;i<(n/2);i++) 29 { 30 temp=s[i]; 31 s[i]=s[n-i-1]; 32 s[n-i-1]=temp; 33 } 34 return ; 35 } 36 37 void solve(char *n, int num) //将字符串的小数部分与整数部分分开 38 { 39 int h=strlen(n); 40 int i,t=0,j; 41 for(i=0;;i++) 42 { 43 if((n[i]=='.')||(i==h)) 44 break; 45 s[num][t++]=n[i]; 46 } 47 len[num]=i; 48 turn(s[num],len[num]); 49 num++; 50 t=0; 51 for(j=i+1;j<h;j++) 52 s[num][t++]=n[j]; 53 if(i!=h) //是否存在小数部分,若i=h则表示小数部分不存在 54 len[num]=h-i-1; 55 } 56 57 void add(char *s1,int &n1,char *s2,int &n2,int flag) 58 { 59 //flag=0表示处理的是整数部分的加法。flag=1表示处理的是小数部分的加法。注意二者细微的不同 60 int carry=0,i; 61 char t; 62 n1=n1>n2?n1:n2; 63 if(flag) 64 { 65 turn(s1,n1); 66 turn(s2,n1); 67 } 68 for(i=0;i<=n1;i++) 69 { 70 t=s1[i]; 71 s1[i]=((t-'0')+(s2[i]-'0')+carry)%10+'0'; 72 carry=((t-'0')+(s2[i]-'0')+carry)/10; 73 } 74 if(!flag&&(s1[n1]!='0'))//整数部分高位0的处理,若最高最高位不为0,则长度加1 75 n1++; 76 if(flag&&(s1[n1]!='0')) 77 { 78 p=s1[n1]; //p保存的是小数部分进位到整数部分的值 79 } 80 // s1[n1]='\0'; 81 return ; 82 } 83 84 int main() 85 { 86 int i; 87 while(cin>>m>>n) 88 { 89 init(); 90 p=0; //p保存的是小数部分进位到整数部分的值 91 solve(m,1); 92 solve(n,3); 93 add(s[1],len[1],s[3],len[3],0); 94 add(s[2],len[2],s[4],len[4],1); 95 turn(s[2],len[2]); 96 for(i=len[2]-1;i>=0;i--) //小数部分后缀0的处理 97 { 98 if(s[2][i]=='0') 99 len[2]--; 100 else 101 break; 102 } 103 s[2][len[2]]='\0';//注意给字符串末尾加上"\0"便于输出 104 if(p) //整数部分加上小数部分的进位 105 { 106 s[0][0]=p; 107 len[0]=1; 108 add(s[1],len[1],s[0],len[0],0); 109 } 110 turn(s[1],len[1]); 111 s[1][len[1]]='\0'; 112 cout<<s[1]; 113 if(len[2]!=0) 114 cout<<"."<<s[2]; 115 cout<<endl; 116 } 117 return 0; 118 } 119


只有注册用户登录后才能发表评论。
相关文章:
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理