大明A+B
Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5533????Accepted Submission(s): 1870
Problem Description
話說,經過了漫長的一個多月,小明已經成長了許多,所以他改了一個名字叫“大明”。 這時他已經不是那個只會做100以內加法的那個“小明”了,現在他甚至會任意長度的正小數的加法。
現在,給你兩個正的小數A和B,你的任務是代表大明計算出A+B的值。
現在,給你兩個正的小數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
1 /*
2 帶小數點的大數加法
3 思路清晰簡單,幾分鐘就想清楚
4 但敲代碼1個多小時,改錯又是1個半小時 汗……
5 要提高敲鍵盤的速度以及正確率啊,還有就是敲之前一定要想清楚
6 */
7
8 #include <iostream>
9 #include <string.h>
10 #include <stdio.h>
11 #include <math.h>
12 using namespace std;
13 const int MAX=1000;
14 char que[3][MAX]; //存入初始字符串
15 int data[3][MAX]; //存入字符串轉換過來的數據
16 int answer[MAX]; //最后的答案
17 int main()
18 {
19 int len[3]; //兩字符串長度
20 int dian[3]; //字符串轉換成實數后小數點的位置
21 while(scanf("%s%s",que[1],que[2])!=EOF)
22 {
23 memset(data,0,sizeof(data));
24 memset(answer,0,sizeof(answer));
25 len[1]=strlen(que[1])-1;
26 len[2]=strlen(que[2])-1;
27 //printf("len %d %d\n",len[1],len[2]);
28 //printf("%s %s\n",que[1],que[2]);
29 dian[1]=-1;
30 dian[2]=-1;
31
32 //for循環將字符串轉換成實數,并找出小數點的位置
33 for(int i=1;i<3;i++)
34 for(int j=len[i];j>=0;j--)
35 {
36 if(que[i][j]=='.')
37 dian[i]=len[i]-j;
38 else
39 data[i][len[i]-j]=que[i][j]-'0';
40 }
41 /*
42 檢驗數據的轉換是否完成以及小數點的位置
43 for(int i=0;i<=len[1];i++)
44 printf("%d ",data[1][i]);
45 printf("\n");
46 for(int i=0;i<=len[2];i++)
47 printf("%d ",data[2][i]);
48 printf("\n");
49 printf("%d %d\n",dian[1],dian[2]);
50 */
51
52 //將兩個實數的小數點對齊
53 int sub;
54 if(dian[1]>dian[2])
55 {
56 sub=dian[1]-dian[2];
57 for(int j=len[2]+sub;j>=0;j--)
58 {
59 if(j>=sub)
60 data[2][j]=data[2][j-sub];
61 else
62 data[2][j]=0;
63 dian[2]=dian[1];
64 }
65 }
66 if(dian[2]>dian[1])
67 {
68 sub=dian[2]-dian[1];
69 for(int j=len[1]+sub;j>=0;j--)
70 {
71 if(j>=sub)
72 data[1][j]=data[1][j-sub];
73 else
74 data[1][j]=0;
75 dian[1]=dian[2];
76 }
77 }
78
79 /*
80 //小數點轉換完成后的實數數據以及小數點的位置
81 for(int i=0;i<=len[1]+sub;i++)
82 printf("%d ",data[1][i]);
83 printf("\n");
84 for(int i=0;i<=len[2]+sub;i++)
85 printf("%d ",data[2][i]);
86 printf("\n");
87 printf("dian %d %d\n",dian[1],dian[2]);
88 */
89 for(int i=0;i<2+len[1]+len[2];i++)
90 {
91 answer[i]=data[1][i]+data[2][i];
92 //printf("%d ",answer[i]);//兩數相加但是并不進位
93 }
94 //printf("\n");
95
96 //進位處理,注意小數點在進位時的影響
97 for(int i=0;i<2+len[1]+len[2];i++)
98 {
99 if(i+1==dian[1])
100 {
101 answer[i+2]+=answer[i]/10;//跳過小數點位置進位
102 answer[i]=answer[i]%10;
103 i++;
104 }
105 else
106 {
107 answer[i+1]+=answer[i]/10;
108 answer[i]=answer[i]%10;
109 }
110 }
111 //令小數點位置處為零,防止尋找s時造成影響
112 if(dian[1]>=0)
113 answer[dian[1]]=0;
114 int s,t;
115 //尋找數據輸出的最低位
116 for(s=0;s<=dian[1];s++)
117 if(answer[s]!=0)
118 break;
119 //尋找數據輸出的最高位
120 for(t=len[1]+len[2]+2;t>dian[1];t--)
121 if(answer[t]!=0)
122 break;
123 //printf("s=%d t=%d\n",s,t);
124 //若相加兩數均為整數,則個位為最低位,輸出時無小數點
125 if(dian[1]==-1)
126 s=0;
127
128 for(int i=t;i>=s;i--)
129 {
130 if(i==dian[1])
131 printf(".");
132 else
133 printf("%d",answer[i]);
134 }
135
136 printf("\n");
137
138 }
139 //cout << "Hello world!" << endl;
140 return 0;
141 }
?
?
?
?