题解 P1581 【A+B Problem(升级版)】
Blue_wonders · · 题解
题目没读懂的往这看,详细解释题目输入输出
按照题意简单的模拟(绝对简单易懂)
这次排坑和思路放在一起了
样例输入:
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;
}
感谢大家看我的题解~!