题解 P1581 【A+B Problem(升级版)】

· · 题解

题目没读懂的往这看,详细解释题目输入输出

按照题意简单的模拟(绝对简单易懂)

这次排坑和思路放在一起了

样例输入: 
      1     ,      0     +      2      ,     1
第一个数十位  第一个数个位  第二个数十位 第二个数个位
相加变成                 0 , 0 , 0 , 0 , 3 , 1 
(这里是每一位的进位大小)  13  11  7   5   3   2
所以变成了               0 , 0 , 0 , 1 , 0 , 1
输出按照从高位到低位输出   1  ,   0  ,   1
                        百位   十位   个位
样例输出:1,0,1

自己写的输入,并附上自己的做法:
输入:12,1,4,6,8+26,4,7,9,5
输出:3,6,1,3,0,1
做法:从后往前入(从个位输入,好处是方便判断数的位数)
  位数表      十万  ,  万  ,  千  ,  百  ,  十  ,  个 
 每一位的进制   13      11      7     5      3      2

1、输入第二个数 0       26      4      7      9      5
2、加上第一个数 0       38      5     11     15     13
3、从最小位     0       38      5     11    15+6     1
   判断是否     0       38      5    11+7     0      1
   需要进位     0       38     5+3     3      0      1
   并进位       0      38+1     1      3      0      1
              0+3       6      1      3      0      1
               3        6      1      3      0      1
4、输出3,6,1,3,0,1 

AC代码在这

#include<bits/stdc++.h>
using namespace std;
string s;
int c[7]={0,2,3,5,7,11,13};//判断每一位数进位的标准 
int a[7];//存放每一位数的容器 
void chack(int q){//进位函数
    a[q+1]=a[q+1]+(a[q]/c[q]);//上一位加上这一位进的数
    a[q]=a[q]%c[q];//这一位是进完位之后剩下的数
    return;
}
int main(){
    cin>>s;//按照字符串读入 
    int n=s.size(),i=n-1,u=1;
    while(i>=0){//从最后判断,从个位数加起 
        if(s[i]>='0'&&s[i]<='9'){//如果是数字 
            if(s[i-1]>='0'&&s[i-1]<='9'){//如果是两位数 
                a[u]=a[u]+(s[i-1]-48)*10+(s[i]-48);//在数位上加入这个数 
                i--;//前面的数已经被加上了,不能循环 
            }
            else a[u]=a[u]+s[i]-48;//是一位数,就在这个数位上加这个数 
            u++;//加入数字后,下一个数字要在下一个数位上 
        }
        if(s[i]=='+')u=1;//如果是加号,那么代表这个数输完了,重新从各位开始 
        i--;//循环下一个数 
    }
    for(int i=1;i<=5;i++)chack(i);//将每个数位都判断是否需要进位 
    int t=0;//t用来标记最大位的位置 
    for(int i=6;i>=1;i--)if(a[i]!=0){t=i;break;};//先找最大位是哪个 
    for(int i=t;i>=2;i--)cout<<a[i]<<",";//从最大位输出,一直输出到10位,后面加‘,’ 
    cout<<a[1];//最后输出各位后面没有‘,’ 
    return 0;
}

感谢大家看我的题解~!