PTA 1074 宇宙无敌加法器 (c++ 思路+全测试点分析)

1074 宇宙无敌加法器 (20 分)

PTA 1074 宇宙无敌加法器 (c++ 思路+全测试点分析)_第1张图片
首先我要说,这道题真坑。。。真坑。。。。
好,下面进入正题。

思路:其实你要说怎么做的话,这道题并不算难。我这里建立了三个字符串类型用于接收输入的三个数。然后从最高位开始以此往下加,其实类似与电路里面的加法器。下面代码注释的很清楚,应该容易看明白,哪里不明白的话可以在下方评论,我看到会回你的。

测试点分析:
首先说1,3这两个点。最后我卡在这两个点好久好久。这两个点就是如果进位数的位数大于两个相加的位数的长度的话,你要怎么处理。比如说输入503 1 2 输出就应该是10而不是0(你可以看我15,16行注释的这两个代码和17,18行的区别)。
然后说2,4这两个点。这两个点比较容易,就是你设置的接收数据的变量类型,考虑不要超出范围了(所以我用的字符串)
最后说5这个点,就是前导0不能输出(我的20~26行代码),还有就是如果结果为0,就要输出0(最后一行代码);

#include 
using namespace std;
int main()
{
    string M,A,B;
    int s[1000]={0},t=0;//存放最终结果
    cin>>M>>A>>B;
    int a=A.size()-1,b=B.size()-1,m=M.size()-1,n1,n2,d,x=0;
    for(;a>=0||b>=0;t++,a--,b--,m--)
    {
        n1=a>=0?A[a]-'0':0;//如果A取完了就取0 
        n2=b>=0?B[b]-'0':0;//同A 
        d=m<0||M[m]=='0'?10:M[m]-'0';//m<0是指进位制长度小与输入的相加的位数所以用10进制  
/*        s[t]=(x+n1+n2)%d;//进位数加本位的两个数对进制数取余 
        x=(x+n1+n2)/d;//存放进位数;*/
        s[t+1]=(s[t]+n1+n2)/d;
        s[t]=(s[t]+n1+n2)%d;
    }
    bool flag=false;
    for(;t>=0;t--)
    {
    	if(!flag&&!s[t])	continue;//如果是前导0,则不能输出 
    	if(s[t])	flag=true;
    	cout<

你可能感兴趣的:(PTA,Basic,Level)