Posted on 2010-09-08 08:36
lzh525 阅读(564)
评论(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
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