**火星A+B(HDOJ)

http://acm.hdu.edu.cn/showproblem.php?pid=1230

感觉压根没看明白题目意思。

后来逐步仔细审题,其实也是一道模拟题,模拟人在做A+B的方式来编程。

十进制38=1*5*3*2+1*3*2+1*2

两个火星数相加不用将它化成10进制在相加再化回去,有更直接的办法即火星数的各个位分别相加,再考虑上进位(carry)。

#include<iostream>
#include<algorithm>
#include<string>

using namespace std;
int x[30],y[30];

int prim[30]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113};

int main()
{
    string a,b;//存储读入的火星数
    int j=0,k=0;//用于保存火星数的位数
    while(cin>>a>>b&&a!="0"&&b!="0")
    {
         memset(x,0,sizeof(x));
         memset(y,0,sizeof(y));
         j=0,k=0;
         for(int i=0;i<a.size();i++)
         {
              if(a[i]==',')
                 j++;
              else
              x[j]=x[j]*10+a[i]-'0';//将字符化为10进制数字
         }
         for(int i=0;i<b.size();i++)
         {
              if(b[i]==',')
                 k++;
              else
              y[k]=y[k]*10+b[i]-'0';
         }
         reverse(x,x+j+1);//翻转以利于处理
         reverse(y,y+k+1);
         int carry=0;//进位
         int len1=j+1,len2=k+1,len=0;
         bool flag=false;
         if(len1>len2)
         {
               flag=true;
               swap(len1,len2);//小的在len1,大的在len2
         }
         //cout<<len1<<" "<<len2<<endl;
         int z[30];//保存结果
         for(int i=0;i<len1;i++)
         {
                z[i]=x[i]+y[i]+carry;
                carry = z[i]/prim[i];//进位
                z[i] %= prim[i];
         }
         for(int i=len1;i<len2;i++)
         {
                 int temp=0;
                 if(!flag)
                 temp=y[i];
                 else
                 temp=x[i];
                 z[i]=temp+carry;
                 carry = z[i]/prim[i];
                 z[i] %= prim[i];
         }
         len=len2-1;
         if(carry)
         {
                  z[len2]=carry;len=len2;//最高位进位
         }
         for(int i=len;i>=0;i--)
         {
                 if(i==len)
                 cout<<z[i];
                 else
                 cout<<","<<z[i];//打印输出                 
         }
         cout<<endl;        
         
    }
    system("pause");
    return 0;
}

AC完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值