ACM-FJNU18级第二次友谊赛C题-HDU1753(大明A+B)

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 ;//学艺不精,告辞 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值