ACM-FJNU18级第二次友谊赛C题-HDU1753(大明A+B)
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。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
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
就,模拟大数加减嘛,不过是浮点型的,我的思路是分成int跟decimal两个部分模拟,可能比较不好解决的就是进位了,设计一个中介变量对对位之和求商再加到前一位。
代码太乱,懒得优化,学艺不精,告辞。
#include <string.h>//A==B?+loverkey
#include <bits/stdc++.h>
#define N 100050
#define double pai = 4.0*atan(1.0)
#define mes(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long int ll;
string str1, str2;
int main() {
string str1, str2;
while (cin >> str1 >> str2)
{
string str3 = "";//new string报错
int i,j ;
int str1_int=0, str1_xiaoshu=0, str2_int=0, str2_xiaoshu=0;//初始化
int len_1 = str1.size() , len_2 = str2.size();
for (i = 0;i < len_1;i++) {
if (str1[i] == '.')
break;
}
str1_int=i; //让我看看你有多少个int?
if(str1_int != len_1) //防止全int
str1_xiaoshu = len_1 - str1_int - 1/*小数点*/;
for (i = 0;i < len_2;i++) {
if (str2[i] == '.')
break;
}
str2_int=i;
if(str2_int!=len_2)
str2_xiaoshu = len_2 - str2_int - 1;//这段之前都在取长度
int len_xiaoshu = max(str1_xiaoshu, str2_xiaoshu);
//开始模拟 (因为没有听课就只能写得那啥点了,将就看吧?)
int plag = 0 ;
int med ;
int str1_med = str1_xiaoshu, str2_med = str2_xiaoshu;//从小数开始
for (int i = len_1 - 1, j = len_2 - 1 ; i > str1_int || j >str2_int ; (str1_med > str2_med) ? (i-- , str1_med--):((str1_med < str2_med )? (j--,str2_med-- ): (i--, j--))) {
if (str1_med > str2_med)
med = str1[i] - 48 + plag;//想当atoi王子但是用不起来了
else if (str1_med < str2_med)
med = str2[j] - 48 + plag;
else
med = str1[i] - 48 + str2[j] - 48 + plag;
plag = med / 10;//逐位 关键代码
med %= 10;
char ch= med+48;
str3 = ch+str3;//保存结果
}
str3 = '.' + str3;//接着模拟
for ( i = str1_int - 1, j = str2_int - 1 ; i >= 0 || j >= 0 ; i--, j--) {
if ( i >= 0 && j >= 0 )//loverkey模板 (参考之前做过的loverkey)
med = str1[i] - 48 + str2[j] - 48 + plag;
else if (i >= 0 )
med = str1[i] - 48 + plag;
else if (j >= 0 )
med = str2[j] - 48 + plag;
plag = med / 10;
med%= 10;
char ch = med + 48;
str3 = ch + str3;
}
if (plag!=0)
str3 = '1' + str3;
int len = str3.size();
int flag = 0;
for (i = len - 1;i > len-1- len_xiaoshu;i--) {//清除小数点后0(参考之前做过的A==B?)
if (str3[i] != '0')
break;
flag++;
}
if (flag == len_xiaoshu)
flag = len - 1 - len_xiaoshu - 1;
else
flag = len - 1 - flag;
for ( i = 0;i <= flag;i++)
cout << str3[i];
cout << endl;
}
return 0 ;//学艺不精,告辞
}