您的位置:首页 > 其它

hdu 1230 火星A+B

2013-09-12 20:48 274 查看
题目地址: 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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: