hdu 1230 火星A+B

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1230

第i位表示的实际大小是前i 个素数的乘积那么多,(第0位表示1) 进位规则是这一位减去p[i] (例如第0位减去p[0]==2)  高以为加1 ,由于更加难进位了,所以加法先相加,然后一次进位扫描就能保证每一位在范围内。  

输入输出有点麻烦,是这个题的考点吧


代码:

#include<iostream>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;

int p[101];

vector<int>  prime;

int na[25];
int nb[25];
int ans[26];

void pre()
{
  for(int i=2;i<=10;i++)
   if(p[i]==0)
    for(int j=i*i;j<=100;j+=i)
       p[j]=1;
  for(int i=2;i<=100;i++)
      if(p[i]==0)  prime.push_back(i);
}

int max(int a,int b)
{
   return a>b?a:b;

}
int main()
{
  pre();

  string a,b;
  while(cin>>a>>b)
  {
      memset(na,0,sizeof(na));
      memset(nb,0,sizeof(nb));

      if(a=="0"&&b=="0")   break;
      int aa=0,bb=0;
      int cnta=0;
      int cntb=0;

      for(int i=0;i<a.length();i++)
        {
           if(a[i]==',')
           {
              cnta++;

           }

           else
           {
             na[cnta]=10*na[cnta]+a[i]-'0';

           }
        }

      for(int i=0;i<b.length();i++)
        {
           if(b[i]==',')
           {
              cntb++;

           }

           else
           {
             nb[cntb]=10*nb[cntb]+b[i]-'0';

           }
        }


      reverse(na,na+cnta+1);
      reverse(nb,nb+cntb+1);



     for(int i=0;i<25;i++)
       ans[i]=na[i]+nb[i];

     for(int i=0;i<25;i++)
        if(ans[i]>=prime[i])
        {
           ans[i]-=prime[i];
           ans[i+1]+=1;
        }

     int start=0;
     for(int i=25;i>=0;i--)
       {
          if(ans[i]==0) continue;
          else
          {
             start=i;
             break;
          }
       }

     for(int i=start;i>0;i--)
      {
          cout<<ans[i]<<',';
      }

     cout<<ans[0]<<endl;

  }
}


posted @ 2013-09-12 20:48  814jingqi  阅读(99)  评论(0编辑  收藏  举报