• Codeforces Round #762 C. Wrong Addition


    题目链接:https://codeforces.com/contest/1619/problem/C

     

    题目大意

    Tanya正在学习如何添加数字,但到目前为止,她做得并不正确。她使用以下算法将两个数字a和b相加:

     

    如果其中一个数字比另一个短,Tanya会添加前导零,使数字长度相同。

    数字从右到左(即从最低有效数字到最高有效数字)进行处理。

    在第一步中,她将a的最后一位数字与b的最后一位数字相加,并将其总和写入答案中。

    在下一步中,她对同一位置的每对数字执行相同的操作,并将结果写入答案的左侧。

    例如,数字a=17236和b=3465 Tanya加起来如下:


    1106911

    分析

    模拟题,条件比较多。

    代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    
    int t;
    
    signed main()
    {
        cin>>t;
        while(t--)
        {
            string a,s;
            cin>>a>>s;
            int m=a.length();
            int n=s.length();//s长度 
            
            if(m>n)//a的位数更多
            {
                cout<<"-1"<<endl;
                continue;
            }
            
            int p=n-1;
            string ans="";
            int f=0;
            for(int i=m-1;i>=0;i--)
            {
                if(a[i]>s[p])
                {
                    int now_num=s[p]-'0';
                    p--;
                    if(p<0)
                    {
                        f=1;
                        break;//没取的了 
                    }
                    now_num+=((s[p]-'0')*10);//不够从前取
                    p--;
                    if(now_num<a[i]-'0')//还是不够 比如1 100 
                    {
                        f=1;
                        break; 
                    }
                    else if(now_num-(a[i]-'0')>=10)//太多了 
                    {
                        f=1;
                        break;
                    }
                    else//可行 
                    {
                        ans+=(now_num-(a[i]-'0'))+'0';
                    }
                }
                else if(s[p]>=a[i])
                {
                    ans+=(s[p]-'0'-(a[i]-'0'))+'0';
                    p--;
                }
            }
            for(int i=p;i>=0;i--)
            {
                ans+=s[i];
            }
            reverse(ans.begin(),ans.end());//要反过来因为是从尾部插入 
            if(f==1) cout<<"-1"<<endl;
            else
            {
                int f2=0;
                int l=ans.length();
                for(int i=0;i<l;i++)//去掉之前运算加的0 
                {
                    if(ans[i]!='0') f2=1;
                    if(ans[i]=='0'&&f2==0) continue;
                    else cout<<ans[i];
                }
                cout<<endl;
            }
        }    
        return 0;
    }    
  • 相关阅读:
    ps cs5 gif 动画 分解
    api 生成方法
    AVAYA 交换机
    jQuery操作input值
    CMM3 软件升级
    ehcache 使用 缓存:健值,页面,Hibernate,监控
    网络封包分析软件Wireshark
    Hacking Windows 7 SP 1 Using Java Signed Applet Social Engineering Code Execution
    以太网历史
    转:web应用开发的发展方向
  • 原文地址:https://www.cnblogs.com/KyleDeng/p/15713807.html
Copyright © 2020-2023  润新知